.net 依赖注入

102 阅读1分钟

接口实现

相关代码


using System;

namespace ioc1
{
    class Program
    {
        static void Main(string[] args)
        {
            IService service = new ServiceImpl();
            service.Name = "tom";
            service.sayHi();
            Console.Read();
        }

        public interface IService
        {
            public string Name { get; set; }

            public void sayHi();
        }

        public class ServiceImpl : IService
        {
            public string Name { get; set; }

            public void sayHi()
            {
                Console.WriteLine($"你好。我是{Name}");
            }
        }
    }
}

运行结果

image.png

服务注册

下载DI包

image.png

相关代码

using Microsoft.Extensions.DependencyInjection;
using System;

namespace ioc1
{
    class Program
    {
        static void Main(string[] args)
        {

            /*IService service = new ServiceImpl();
            service.Name = "tom";
            service.sayHi();*/


            ServiceCollection services = new ServiceCollection();
            services.AddTransient<ServiceImpl>();
            // 使用using 防止资源泄漏
            using (ServiceProvider sp = services.BuildServiceProvider())
            {
                ServiceImpl t = sp.GetService<ServiceImpl>();
                t.Name = "zhangsan";
                t.sayHi();
            }
            Console.Read();
        }

        public interface IService
        {
            public string Name { get; set; }

            public void sayHi();
        }

        public class ServiceImpl : IService
        {
            public string Name { get; set; }

            public void sayHi()
            {
                Console.WriteLine($"你好。我是{Name}");
            }
        }
    }
}

运行结果

image.png

服务定位器

相关代码

using Microsoft.Extensions.DependencyInjection;
using System;

namespace ioc1
{
    class Program
    {
        static void Main(string[] args)
        {

            ServiceCollection services = new ServiceCollection();

            services.AddScoped<IService, ServiceImpl>();

            // 使用using 防止资源泄漏
            using (ServiceProvider sp = services.BuildServiceProvider())
            {
                IService t = sp.GetService<IService>();
                t.Name = "lisi";
                t.sayHi();
            }
            Console.Read();
        }

        public interface IService
        {
            public string Name { get; set; }

            public void sayHi();
        }

        public class ServiceImpl : IService
        {
            public string Name { get; set; }

            public void sayHi()
            {
                Console.WriteLine($"你好。我是{Name}");
            }
        }
    }
}

运行结果

image.png

demo

相关代码

using Microsoft.Extensions.DependencyInjection;

namespace di
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            services.AddScoped<IConfig, DBConfigImpl>();
            services.AddScoped<Controller>();
            services.AddScoped<ILog, LogImpl>();
            services.AddScoped<IStorage,StorageImpl>();
            

            using(var sp = services.BuildServiceProvider())
            {
                Controller controller = sp.GetRequiredService<Controller>();
                controller.Test();
            }
            Console.ReadKey();
        }
    }

    class Controller
    {
        private readonly ILog log;
        private readonly IStorage storage;
        public Controller(ILog log,IStorage storage)
        {
            this.log = log;
            this.storage = storage;
        }

        public void Test()
        {
            log.Log("开始上传");

            this.storage.Save("内容", "file.txt");

            log.Log("上传完毕");
        }
    }

    interface ILog
    {
        public void Log(string message);
    }

    class LogImpl : ILog
    {
        public void Log(string message)
        {
            Console.WriteLine($"日志为{message}");
        }
    }

    interface IConfig
    {
        public string GetValue(string name);
    }

    class ConfigImpl : IConfig
    {
        public string GetValue(string name)
        {
            return "hello";
        }
    }

    class DBConfigImpl : IConfig
    {
        public string GetValue(string name)
        {
            Console.WriteLine("从数据库读取的配置");
            return "from db";
        }
    }

    interface IStorage
    {
        public void Save(string content, string name);
    }

    class StorageImpl : IStorage
    {
        private readonly IConfig config;
        public StorageImpl(IConfig config)
        {
            this.config = config;
        }
        public void Save(string content, string name)
        {
            string server = config.GetValue("server");
            Console.WriteLine($"向服务器{server}的文件名为{name}上传{content}");
        }
    }
 }

运行结果

image.png

相关优化

修改DependencyInjection类

相关代码

using ConfigServices;
using LogServices;
using MailServices;
using Microsoft.Extensions.DependencyInjection;


namespace MailSender
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection serviceCollection = new ServiceCollection();


            serviceCollection.AddScoped<IConfigService, EnvVarConfigService>();
            serviceCollection.AddLayeredConfig();


            serviceCollection.AddConsoleLog();

            /* serviceCollection.AddScoped(
                 typeof(IConfigService),
                 s =>
                     new IniFileConfigService
                     {
                         FilePath = "mail.ini"
                     });*/
            serviceCollection.AddIniFileConfig("mail.ini");

           /* serviceCollection.AddScoped<IConfigService, EnvVarConfig>();*/
            serviceCollection.AddScoped<IMailService, MailService>();
          /*  serviceCollection.AddScoped<ILogProvider, ConsoleLogProvider>();*/
            
            using (var sp = serviceCollection.BuildServiceProvider())
            {
                // 第一个根上的对象只能用ServiceLocator
                var mailService = sp.GetRequiredService<IMailService>();
                mailService.Send("Hello", "to@123.com", "content");
            }

            Console.Read();
        }
    }
}

重点代码块

serviceCollection.AddScoped(
 typeof(IConfigService),
 s =>
     new IniFileConfigService
     {
         FilePath = "mail.ini"
     });

修改后

serviceCollection.AddIniFileConfig("mail.ini");

DependencyInjection 命名空间下,新增了AddIniFileConfig方法,使用时候只需要传入配置文件信息即可

using ConfigServices;
using MailSender;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Microsoft.Extensions.DependencyInjection
{
    public static class IniFileConfigExtensions
    {
        public static void AddIniFileConfig(this IServiceCollection services,string filePath)
        {
            services.AddScoped(
              typeof(IConfigService),
              s =>
                  new IniFileConfigService
                  {
                      FilePath = filePath
                  });
        }
 
    }
}