第4步,注册服务,还有另一种处理方式,即把注册服务独立出来:
//注册服务独立出来,新增一个类,继承 Autofac.Module public class CustomAutofacModule : Module { protected override void Load(ContainerBuilder builder) { //注册服务 builder.RegisterType(typeof(Service1)).As<Interface1>().SingleInstance();//单例 builder.RegisterType(typeof(Service2)).As<Interface2>().InstancePerLifetimeScope();//线程独立 builder.RegisterType(typeof(Service3)).As<Interface3>().InstancePerDependency();//瞬时,为每个依赖或者调用(Resolve())都创建一个新的对象 } }在Startup里就不用注册服务了,在ConfigureServices下面,新增一个ConfigureContainer方法
// 注册服务独立出来 public void ConfigureContainer(ContainerBuilder builder) { builder.RegisterModule(new CustomAutofacModule()); } 以上Autofac配置完成了,最后在控制器里调用,利用控制器的构造函数注入 public class HomeController : Controller { private readonly Interface1 _Service1; private readonly Interface2 _Service2; private readonly Interface3 _Service3; public HomeController(Interface1 s1, Interface2 s2, Interface3 s3) { //依赖注入 _Service1 = s1; _Service2 = s2; _Service3 = s3; } public IActionResult Index() { _Service1.Show(); _Service2.Show(); _Service3.Show(); return View(); } }6.补充说明,可以使用批量注册方法:
//批量注册 public class AutofacModule : Autofac.Module { protected override void Load(ContainerBuilder builder) { string basePath = AppContext.BaseDirectory; var assembly = Assembly.LoadFrom(Path.Combine(basePath, "AspNetCore.Service.dll")); builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces(); } } 补充说明: builder.RegisterType<A>().AsImplementedInterfaces();,以接口方式进行注入,使用时用IA,会返回一个A的实例,即将自身的实例进行注入;builder.RegisterType<A>().AsImplementedInterfaces().InstancePerRequest() ; 每次请求共享同一个实例,使用ef时,使不同的操作使用同一个数据上下文;builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())注册了当前程序集内的所有的类;InstancePerHttpRequest在一次Http请求上下文中,共享一个组件实例。仅适用于asp.net mvc开发参考文档:ASP.NET Core依赖注入&AutoFac Autofac在ASP.Net Core3.0配置 .net core2.1 三层中使用Autofac代替原来Ioc 关于依赖注入autofac的相关知识