.netcore中的依赖注入

IOC、DI相关概念的理解

1、依赖:简单的讲就是“引用到”。例如AccountController.cs引用到IAccountService.cs,那么AccountController依赖IAccountService。

.netcore中的依赖注入

2、依赖倒置:依赖倒置是指程序要依赖于抽象或者接口,不要依赖于具体实现(高层模块不依赖于底层模块,不依赖于具体实现,而应该依赖接口)。是六大设置原则之一。它的优势在于当高层模块变化时,底层模块无需改动,达到解耦的目的。

3、反转控制(IOC):是一种设计思想,相对于“正转控制”;所谓的“正转控制”是指类内部自行创建其依赖的类。而反转控制则是谁调用谁创建。例如类A依赖类B,那么不应该A自己创建B,而是应该由A的调用者C创建B给A使用。

4、依赖注入(DI):其实就是IOC思想的实践。就是依赖的注入。依赖注入的方式:1、构造函数注入,2、属性注入、3、方法注入

5、IOC容器:无论是反转控制还是“正转控制”,都免不了创建对象,只是改变了创建对象的时机和传递。为了优化这种对象的创建,引入了IOC容器,它相当于对象的工厂,我们只需要注册(绑定)服务与市里的关系,在需要使用时,容器自动帮我们创建,并维护对象的生命周期(创建销毁)

.netcore的依赖注入

.netcore依赖注入的实现是在Microsoft.Extensions.DependencyInjection这个程序集中。

IServiceCollection 负责注册

IServiceProvider 负责提供实例

容器中获取的实例的生命周期分为三种:

1、Transient: 每一次GetService都会创建一个新的实例(瞬时的)

2、Scoped: 在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)(一次请求过程)

3、Singleton :整个应用程序生命周期以内只创建一个实例(单例的)

简要代码说明

/// <summary>
        /// 注册容器
        /// </summary>
        public void RegisterService()
        {
            IServiceCollection services = new ServiceCollection();
            services.AddScoped<IUserManagement, UserManagement>(); //注入会话范围的
            services.AddSingleton<IShippingService, CustomerShippingService>();  //注入单例

            services.AddTransient<IBaseMongoRepository<EmailAccount>, EmailAccountRepository>();  //注入瞬时的,每次从service中获取都是新的一个对象
            serviceProvider = services.BuildServiceProvider();

        }
        /// <summary>
        /// 从容器中获取对象执行
        /// </summary>
        public void UseService()
        {
            var userManagement = serviceProvider.GetService<IUserManagement>();
            var user = userManagement.GetCurrentUser();
        }

上面的代码仅仅是说明.netcore中的依赖注入容器的注册和对象获取。在WebApi项目或者web项目中,我们基本上是不需要编写从容器中获取对象来执行的,一般都是直接在controller的构造函数中声明依赖的服务接口,在startup类中注入服务。在Controller被初始化时,.netcore自动帮我们完成了注入,很方便使用。

相关推荐