首先了解一下概念
如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的? – 胡小国的回答 – 知乎
https://www.zhihu.com/question/32108444/answer/309208647
//我是分割线/
.net core 2.x和3.x 使用autofac注入方式不一样,此文章是针对.net core 3.x
先展示代码结构
1、引入nuget包
首先,我们需要从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
}
4、编写第3步的类
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("IOC.Service");
//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("IOC.Service");
// Assembly Iservice = Assembly.Load("IOC.IService");
// 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, "IOC.Service.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
}
}
5、实现代码(包括代码结构)
属性注入发现为Null 需要在Startup.cs 的 ConfigureServices 方法下加入如下代码
services.AddControllers().AddControllersAsServices(); //控制器当做实例创建
来自https://www.cnblogs.com/shenghuotaiai/p/12829694.html#commentform
版权声明:本文为zhu58252601原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。