zoukankan      html  css  js  c++  java
  • .netcore3.1——使用Autofac替换系统依赖注入组件

    .netcore内置依赖注入,通过services.AddTransient、services.AddScoped、services.AddSingleton这些方法即可实现构造函数注入。

    Autofac可完美替换系统的依赖注入功能,可实现构造函数注入和属性注入,替换过程:

    1、添加引用:

    2、Program修改:

    1         public static IHostBuilder CreateHostBuilder(string[] args) =>
    2             Host.CreateDefaultBuilder(args)
    3             .UseServiceProviderFactory(new AutofacServiceProviderFactory())//集成Autofac
    4             .ConfigureWebHostDefaults(webBuilder =>
    5             {
    6                 webBuilder.UseStartup<Startup>();
    7             });

    这里就加了一行

    3、Startup修改:

    1         //集成Autofac
    2         public void ConfigureContainer(ContainerBuilder builder)
    3         {
    4             //添加依赖注入实例,AutofacModuleRegister就继承自Autofac.Module的类
    5             builder.RegisterModule(new StartupHelp.AutofacModuleRegister());
    6         }

    这是新加的方法,由Autofac来调用,里面就是注册依赖的地方,此处使用了外置对象来注入

    4、注入实现AutofacModuleRegister如下:

     1     public class AutofacModuleRegister : Autofac.Module
     2     {
     3         protected override void Load(ContainerBuilder builder)
     4         {
     5             //程序集范围注入
     6             builder.RegisterAssemblyTypes(typeof(ManagerService).Assembly)
     7                  .Where(t => t.Name.EndsWith("Service"))
     8                  .AsImplementedInterfaces().PropertiesAutowired();
     9             //单个注册
    10             builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().PropertiesAutowired();
    11 
    12             //在控制器中使用属性依赖注入,其中注入属性必须标注为public
    13             var controllersTypesInAssembly = typeof(Startup).Assembly.GetExportedTypes()
    14             .Where(type => typeof(Microsoft.AspNetCore.Mvc.ControllerBase).IsAssignableFrom(type)).ToArray();
    15             builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired();
    16         }
    17     }

    其中注册类必须继承自Autofac.Module,并且在Load中实现注入,此处应用了程序集范围的注入以及单个对象的注入,最后添加的代码是为了支持控制器的属性注入。

    注入的接口(如IUnitOfWork)和实现(UnitOfWork)没有特别。

    注入对象的生命周期与.netcore内置的一致。

    5、使用,可以通过构造函数注入和属性注入,如下:

    1         public IManagerService _managerService { get; set; }
    2         private readonly ILogger _logger;
    3 
    4         public AccountController(ILogger<AccountController> logger)
    5         {
    6             _logger = logger;
    7         }

    其中_logger使用构造函数注入,_managerService为属性注入(应声明为public)。 

  • 相关阅读:
    idea不显示gradle的视图解决办法
    curl: (51) Unable to communicate securely with peer: requested domain name does not match the server's certificate.报错
    记录使用yum安装nginx之后的目录问题
    已安装nginx动态添加模块
    nginx的http_sub_module模块使用之替换字符串
    利用referer属性,记录百度搜索跳转参数
    Springboot中Aspect实现切面(以记录日志为例)
    vue_axios请求封装、异常拦截统一处理
    使用jetty工具包处理url参数成map
    利用Java自带的MD5加密
  • 原文地址:https://www.cnblogs.com/quluqi/p/12720320.html
Copyright © 2011-2022 走看看