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();
            }
        }
  • 相关阅读:
    个人学习代码保存:例8.在存储过程中使用简单的事务处理
    个人学习代码保存:例6.多文件上传
    泛型 .net学习日记
    .net 点击刷新验证码问题
    个人学习代码保存:例11.读取Excel文件中的数据
    个人学习代码保存:例12.读取GridView文件中的数据到Excel文件
    个人学习代码保存:例5.利用标准FileUpload单文件上传
    Android视频采集
    Android视频采集+H264编码
    实时传输协议(RTP)和实时控制协议(RTCP)
  • 原文地址:https://www.cnblogs.com/Lv2014/p/13926865.html
Copyright © 2011-2022 走看看