Autofac IOC框架
ASP.NET Core自带了一个轻量级的IOC容器 但是只提供了最基本的AddXXX方法来绑定实例关系 需要一个一个添加 可以使用其他IOC容器来替换内置的
ABP自带Castle容器
1.安装Nuget包 Autofac 和 Autofac.Extensions.DependencyInjection
2.使用Autofac替换自带的IOC容器
在Startup.cs中如果ConfigureServices方法返回类型是void 改成IServiceProvider
先定义一个容器 public Autofac.IContainer ApplicationContainer { get; private set; }
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); //实例化Autofac容器 var builder = new ContainerBuilder(); //将Services中的服务填充到Autofac中 builder.Populate(services); //新模块组件注册 builder.RegisterModule<AutofacModuleRegister>(); //创建容器接收 var Container = builder.Build(); //这里可以不需要在上面定义ApplicationContainer 这句代码可以不要 //this.ApplicationContainer = Container; //第三方IOC接管 core内置DI容器 return new AutofacServiceProvider(Container);
AutofacModuleRegister.cs
public class AutofacModuleRegister : Autofac.Module { //重写Autofac管道Load方法,在这里注册注入 protected override void Load(ContainerBuilder builder) { //找到AutofacMvcDemo程序集中,以Service结尾的类,找到满足的类和实现的接口自动进行注册 builder.RegisterAssemblyTypes(GetAssemblyByName("JcbApplication")).Where(a => a.Name.EndsWith("Service")).AsImplementedInterfaces(); //找到Program类型所在的程序集,以Repository结尾的类,找到满足的类和实现的接口自动进行注册 builder.RegisterAssemblyTypes(GetAssemblyByName("JcbApplication")).Where(a => a.Name.EndsWith("Repository")).AsImplementedInterfaces(); //某个接口有多个实现类 需要特殊的进行手动注册 最后一个参数就是标识 字符串 builder.RegisterType<SqlService>().Named<ISqlService>(typeof(SqlService).Name); builder.RegisterType<MySqlService>().Named<ISqlService>(typeof(MySqlService).Name); } /// <summary> /// 根据程序集名称获取程序集 /// </summary> /// <param name="AssemblyName">程序集名称</param> /// <returns></returns> public static Assembly GetAssemblyByName(String AssemblyName) { return Assembly.Load(AssemblyName); } }
3.当一个接口有多个实例 使用的时候需要指定
public class HomeController : Controller { private IPersonService _personService; private ISqlService _sqlService; private ISqlService _mysqlService; private IComponentContext _componentContext;//Autofac上下文 public HomeController(IPersonService personService, IComponentContext componentContext) { this._personService = personService; this._componentContext = componentContext; this._sqlService = _componentContext.ResolveNamed<ISqlService>(typeof(SqlService).Name); this._mysqlService = _componentContext.ResolveNamed<ISqlService>(typeof(MySqlService).Name); } public IActionResult Index() { var aa = _personService.GetData(); var bb = _sqlService.GetData(); var cc = _mysqlService.GetData(); return View(); }
多种不同的注册方式
https://www.cnblogs.com/bluesummer/p/8875702.html
//注册同一接口的多个实例
https://www.cnblogs.com/wei325/p/9191686.html