.netcore内置依赖注入,通过services.AddTransient、services.AddScoped、services.AddSingleton这些方法即可实现构造函数注入。
Autofac可完美替换系统的依赖注入功能,可实现构造函数注入和属性注入,替换过程:
1、添加引用:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuMDMxMjN4MTN5ETL0UTM4EzNxUTM3EDNwAjMwITLzYTO0QzLcRDMwIDMy8CXzYTO0QzLcd2bsJ2Lc12bj5ycn9Gbi52YuAjMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
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)。
作者:屈鲁奇
出处:https://www.cnblogs.com/quluqi
联系:[email protected] QQ:496195435
本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接。如有问题或建议,请多多赐教,非常感谢。