zoukankan      html  css  js  c++  java
  • 依赖注入

    内置依赖注入

    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();
            }
        }
  • 相关阅读:
    Python之路第二篇——Python环境与安装
    div层、fieldset分组标签、table表格的居中特效的综合运用
    在不影响系统的情况下给C盘添加磁盘空间(分区工具)
    C# windowsFroms更换皮肤的简单使用
    第二代居民身份证阅读器GTICR100(国腾)接口类调用方法
    C# 指定字符串截取方法
    C# 报表(report)和LocalReport类如何实现打印?
    RewriterURL实现二级域名的访问
    如何修改VS2012产品使用权属于某某的名称?
    OS与Internet
  • 原文地址:https://www.cnblogs.com/Lv2014/p/13926865.html
Copyright © 2011-2022 走看看