NET Core3.1 用 Autofac 实现IOC容器
2021-04-13 13:28
标签:方法 dep stat 扩展 tde note 输出 函数 his IOC(Inversion of Control,控制反转),他不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合,更优良的程序。 DI(依赖注入)。IOC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。 使用依赖注入,有以下优点: 在Nuget中引入两个:Autofac.Extras.DynamicProxy(Autofac的动态代理,它依赖Autofac,所以可以不用单独引入Autofac)、Autofac.Extensions.DependencyInjection(Autofac的扩展) Core 3.0以上版本写法请注意和2.2是不一样的,完整代码如下 这是一个学习的思路,大家要多想想,可能会感觉无聊或者没用,但是对理解项目启动和加载,还是很有必要的。 1、项目最终只依赖抽象 最终的效果是这样的:工程只依赖抽象,把两个实现层删掉,引用这两个接口层。 2、配置仓储和服务层的程序集输出 将 Blog.Repository 层和 Service 层项目生成地址改成相对路径,这样大家就不用手动拷贝这两个 dll 了,F6编译的时候就直接生成到了 api 层 bin 下了: 好了,项目启动就可以运行了 经常会遇到一个错误:None of the constructors found with ........, 查看你的service服务,是不是用了其他的仓储repository,但是又缺少了构造函数。 NET Core3.1 用 Autofac 实现IOC容器 标签:方法 dep stat 扩展 tde note 输出 函数 his 原文地址:https://www.cnblogs.com/shuaichao/p/12386855.html一、IOC容器
二、使用——Autofac
1、引入nuget包
2、在Startup类下面创建 ConfigureContainer 方法
public void ConfigureContainer(ContainerBuilder builder)
{
var basePath = Microsoft.DotNet.PlatformAbstractions.ApplicationEnvironment.ApplicationBasePath;
//注册要通过反射创建的组件
//builder.RegisterType().As
//项目引用接口, 服务层和仓储层的bin文件直接使用,实现解耦
var servicesDllFile = Path.Combine(basePath, "Blog.Core.Services.dll");
var repositoryDllFile = Path.Combine(basePath, "Blog.Core.Repository.dll");
if (!(File.Exists(servicesDllFile) && File.Exists(repositoryDllFile)))
{
throw new Exception("Repository.dll和service.dll 丢失,因为项目解耦了,所以需要先F6编译,再F5运行,请检查 bin 文件夹,并拷贝。");
}
// AOP 开关,如果想要打开指定的功能,只需要在 appsettigns.json 对应对应 true 就行。
var cacheType = new List没有接口的单独类 class 注入,只能注入该类中的虚方法
///
//虚方法
public virtual string SayLoveU()
{
return "I ♥ U";
}
}
3、在program类下面build
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory()) //
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder
.UseStartup
4、构造函数方式来注入
依赖注入有三种方式(构造方法注入、setter方法注入和接口方式注入),我们平时基本都是使用其中的构造函数方式实现注入,
//接口
readonly IAdvertisementServices _advertisementServices;
/// Get(int id)
{
//IAdvertisementServices advertisementServices = new AdvertisementServices(); //不依赖注入是需要引用两个命名空间IServices层和Services层
//使用
return await _advertisementServices.Query(d => d.Id == id);
}
5、程序集注入 —— 实现层级引用的解耦
“..\Blog.Core\bin\Debug\”
常见错误: 参考自:https://www.cnblogs.com/laozhang-is-phi/p/9541414.html
如果写的不明白可以看看大神原文,我是在跟着大神学习的,下节学习AOP切面
上一篇:css知识小结g
文章标题:NET Core3.1 用 Autofac 实现IOC容器
文章链接:http://soscw.com/index.php/essay/75216.html