ASP.NET Core 3.1 使用autofac注入
1.从nuget引用相关的包
Autofac.Extensions.DependencyInjection (这个包扩展了一些微软提供服务的类.来方便替换autofac)
2.在Program.cs 新增一行代码
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }).UseServiceProviderFactory(new AutofacServiceProviderFactory());
3.在Startup.cs 增加以下方法
public void ConfigureContainer(ContainerBuilder containerBuilder) { containerBuilder.RegisterModule<ConfigureAutofac>(); }
ConfigureAutofac 是自己封装的一个类 继承了 Autofac.Module 也可以将以下代码直接写在这个方法里面
public class ConfigureAutofac : Autofac.Module { protected override void Load(ContainerBuilder containerBuilder) { //直接注册某一个类和接口 //左边的是实现类,右边的As是接口 //containerBuilder.RegisterType<TestServiceE>().As<ITestServiceE>().SingleInstance(); #region 方法1 Load 适用于无接口注入 //var assemblysServices = Assembly.Load("Exercise.Services"); //containerBuilder.RegisterAssemblyTypes(assemblysServices) // .AsImplementedInterfaces() // .InstancePerLifetimeScope(); //var assemblysRepository = Assembly.Load("Exercise.Repository"); //containerBuilder.RegisterAssemblyTypes(assemblysRepository) // .AsImplementedInterfaces() // .InstancePerLifetimeScope(); #endregion #region 方法2 选择性注入 与方法1 一样 // Assembly Repository = Assembly.Load("Exercise.Repository"); // Assembly IRepository = Assembly.Load("Exercise.IRepository"); // containerBuilder.RegisterAssemblyTypes(Repository, IRepository) //.Where(t => t.Name.EndsWith("Repository")) //.AsImplementedInterfaces().PropertiesAutowired(); // Assembly service = Assembly.Load("Exercise.Services"); // Assembly Iservice = Assembly.Load("Exercise.IServices"); // containerBuilder.RegisterAssemblyTypes(service, Iservice) //.Where(t => t.Name.EndsWith("Service")) //.AsImplementedInterfaces().PropertiesAutowired(); #endregion #region 方法3 使用 LoadFile 加载服务层的程序集 将程序集生成到bin目录 实现解耦 不需要引用 //获取项目路径 var basePath = Microsoft.DotNet.PlatformAbstractions.ApplicationEnvironment.ApplicationBasePath; var ServicesDllFile = Path.Combine(basePath, "Exercise.Services.dll");//获取注入项目绝对路径 var assemblysServices = Assembly.LoadFile(ServicesDllFile);//直接采用加载文件的方法 containerBuilder.RegisterAssemblyTypes(assemblysServices).AsImplementedInterfaces(); var RepositoryDllFile = Path.Combine(basePath, "Exercise.Repository.dll"); var RepositoryServices = Assembly.LoadFile(RepositoryDllFile);//直接采用加载文件的方法 containerBuilder.RegisterAssemblyTypes(RepositoryServices).AsImplementedInterfaces(); #endregion #region 在控制器中使用属性依赖注入,其中注入属性必须标注为public //在控制器中使用属性依赖注入,其中注入属性必须标注为public var controllersTypesInAssembly = typeof(Startup).Assembly.GetExportedTypes() .Where(type => typeof(Microsoft.AspNetCore.Mvc.ControllerBase).IsAssignableFrom(type)).ToArray(); containerBuilder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired(); #endregion } }
4.在Startup.cs 的 ConfigureServices 方法下加入如下代码
services.AddControllers().AddControllersAsServices();