依赖注入

内置依赖注入

ASP.NET Core 支持依赖关系注入 (DI) 软件设计模式,这是一种在类及其依赖关系之间实现控制反转 (IoC) 的技术。

一 组件包

实现ASP.NET Core内置依赖注入,需要使用它的抽象与实现两个组件包。

  • Microsoft.Extensions.DependencyInjection.Abstractions
  • Microsoft.Extensions.DependencyInjection

二 核心类

1.ASP.NET Core内置依赖注入,包含了4个核心类,实现了容器内服务的注册和生命周期管理。

  • IServiceCollection 负责服务的注册。
  • ServiceDescriptor 服务注册时的信息
  • IServiceProvider 服务容器
  • IServiceScope 子容器的生命周期

2.生命周期ServiceLifetime

  • Singleton 单例
  • Transient 瞬时
  • Scoped 作用域

三 注册方式

        public void ConfigureServices(IServiceCollection services)
        {
            //单例注册
            services.AddSingleton<ISingletonService, SingletonService>();
            //瞬时注册
            services.AddTransient<ITransientService, TransientService>();
            //作用域注册
            services.AddScoped<IScopedService, ScopedService>();
            services.AddMvc();
        }

用Autofac增强容器能力

Autofac是比较老牌的第三方IOC容器。

一 组件包

替换内置的DI容器管理需要引用Autofac的实现组件包,使用AOP需要引入Autofac动态代理组件包

  • Autofac.Extensions.DependencyInjection
  • Autofac.Extras.DynamicProxy

二 核心扩展接口

    public interface IServiceProviderFactory<TContainerBuilder>

三 注册方式

Program修改部分高亮显示。

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }

Startup类代码修改内容高亮显示。

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
        }
        public void ConfigureContainer(ContainerBuilder builder)
        {
            //注册单例
            builder.RegisterType<SingletonService>().As<ISingletonService>().SingleInstance();
            //注册顺时
            builder.RegisterType<TransientService>().As<ITransientService>();

        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }

    }

四 使用方法

下面使用了构造函数注入和方法注入

    public class HomeController : Controller
    {

        private readonly ISingletonService _singletonService;
        private readonly ITransientService _transientService;
        public HomeController(ISingletonService singletonService, ITransientService transientService)
        {
            _singletonService = singletonService;
            _transientService = transientService;

        }

        [HttpGet]
        public string Get([FromServices]ISingletonService singletonService1, [FromServices]ISingletonService singletonService2
            , [FromServices]ITransientService transientService1, [FromServices]ITransientService transientService2)
        {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.Append($"singletonService:{_singletonService.GetHashCode()}<br />");
            stringBuilder.Append($"singletonService1:{singletonService1.GetHashCode()}<br />");
            stringBuilder.Append($"singletonService2:{singletonService2.GetHashCode()}<br />");
            stringBuilder.Append($"_transientService:{_transientService.GetHashCode()}<br />");
            stringBuilder.Append($"transientService1:{transientService1.GetHashCode()}<br />");
            stringBuilder.Append($"transientService2:{transientService2.GetHashCode()}");
            return stringBuilder.ToString();
        }
    }
posted @ 2020-11-04 17:08  2014吕小柯  阅读(82)  评论(0)    收藏  举报