.Net Core AutoFac 使用方法讲解大全,具体详细使用知识总结
AutoFac 具体使用知识总结
阅读前提示 AutoFac 只是众多IOC框架的其中一种, 比较主流的有
Unity
、autofac
、spring.net
、MEF
、Injection
、Asp.Net Core
的ServiceCollection
,等一些,还有一些,可能自己实现这一套东西。
1.为什么使用AutoFac? (自己的理解综合所链接的因素)
- 传说是速度最快的一个,轻量级性能高
- C#语言联系很紧密,许多框架如Abp都会有默认支持AutoFac,微软的Orchad开源程序使用的就是Autofac
- 支持很多的注入方式,除了传统的 构造函数注入,DI容器注入(使用
IServiceProvider
接口的对象) 如方法注入,属性注入,控制器注入 这些特殊的方式
2.缺点 - 传说没有微软自带的 依赖注入 速度快
AutoFac 几种依赖注入使用方法介绍
演示绝大部分都是在 Startup.cs 里面进行的,也有一个测试的控制器
TestController
,重在理解,以下是自己研究的项目源码GitHub地址:最基本的注入方式 通过DL容器的方式 一般的容器注入 初始
IServiceCollection serviceDescriptors = new ServiceCollection();
//指定关系
serviceDescriptors.AddScoped<ITestAService, TestAService>();
//build
ServiceProvider serviceProvider = serviceDescriptors.BuildServiceProvider(); //下面是作用域的关系比较 //1.同一个作用域 获取的实例 时同一个
//var testA = (ITestAService)serviceProvider.GetService<ITestAService>();
//var testA1 = (ITestAService)serviceProvider.GetService<ITestAService>();
//var isEq = object.ReferenceEquals(testA, testA1); //2.再次Build时 范围声明周期 已经发生了变化
//ServiceProvider serviceProvider1 = serviceDescriptors.BuildServiceProvider();
//var testA2 = (ITestAService)serviceProvider1.GetService<ITestAService>(); //var isEq1 = object.ReferenceEquals(testA1, testA2); //testA.show();
AutoFac容器最简单的使用
//容器构建着
ContainerBuilder containerBuilder = new ContainerBuilder();
//指定关系
containerBuilder.RegisterType<TestAService>().As<ITestAService>();
//构建
IContainer container = containerBuilder.Build();
//获取服务
ITestAService testA3 = container.Resolve<ITestAService>();
testA3.show();
AutoFac容器 默认支持构造函数注入
ContainerBuilder containerBuilder1 = new ContainerBuilder();
containerBuilder1.RegisterType<TestAService>().As<ITestAService>();
containerBuilder1.RegisterType<TestBService>().As<ITestBService>();
IContainer container1 = containerBuilder1.Build();
ITestBService testB = container1.Resolve<ITestBService>();
testB.show();
AutoFac容器 属性注入 PropertiesAutowired()
ContainerBuilder containerBuilder2 = new ContainerBuilder();
containerBuilder2.RegisterType<TestAService>().As<ITestAService>();
containerBuilder2.RegisterType<TestBService>().As<ITestBService>();
//支持属性注入的方法
containerBuilder2.RegisterType<TestCService>().As<ITestCService>().PropertiesAutowired();
IContainer container2 = containerBuilder2.Build(); ITestCService testC = container2.Resolve<ITestCService>();
testC.show();
AutoFac 支持的方法注入
ContainerBuilder containerBuilder3 = new ContainerBuilder();
containerBuilder3.RegisterType<TestAService>().As<ITestAService>();
containerBuilder3.RegisterType<TestBService>().As<ITestBService>();
//支持属性注入的方法
containerBuilder3.RegisterType<TestCService>().As<ITestCService>().PropertiesAutowired();
//方法注入
//其中的SetSevice()方法是在 TestDService里面定义的一个方法
containerBuilder3.RegisterType<TestDService>().OnActivated(a => a.Instance.SetSevice(a.Context.Resolve<ITestAService>())).As<ITestDService>();
//使用
IContainer container3 = containerBuilder3.Build();
ITestDService testD = container3.Resolve<ITestDService>();
testD.show();
AutoFac 声明周期 瞬时(每次获取对象都是一个全新的实例) 示例
ContainerBuilder containerBuilder4 = new ContainerBuilder();
containerBuilder4.RegisterType<TestAService>().As<ITestAService>().InstancePerRequest(); //InstancePerDependency 瞬时
//InstancePerLifetimeScope() 范围
// InstancePerMatchingLifetimeScope("name名称") *匹配 name* 声明周期范围实例
//SingleInstance 单例
//InstancePerRequest 每一个请求,一个实例 IContainer container4 = containerBuilder4.Build();
ITestAService testA4 = container4.Resolve<ITestAService>();
ITestAService testA5 = container4.Resolve<ITestAService>();
//比较
var IsEq = object.ReferenceEquals(testA4, testA5);
Console.WriteLine(IsEq);
AutoFac 特殊的控制器中使用 属性注入方式
需要使用两个特性来实现
CustomPropertyAttribute 特性用来 当作标识,且声明只能是属性才能使用该特性
CustomPropertySelector 特性是需要给控制器告知哪些属性是可以注入的 (需要一个判断的维度)
具体代码详见 GitHub 示例
整个项目 使用AutoFac 自动构建 关系
方式一 使用 配置文件 (完全断开对 实体的依赖)
- 安装 支持的Nuget包
- Autofac.Extensions.DependencyInjection
- Autofac.Configuration
- 内部好像也是用来反射
Dll
来实现,感觉配置文件也挺复杂,所以就没有使用这种方案
- 安装 支持的Nuget包
方式二 使用用反射来实现 ******
1.收钱 需要在ConfigureServices 里面提供 控制器注入的支持
//AutoFac 提供控制器支持
//1 替换控制器的替换规则
//1.1 可以指定控制器让 容器来创建
services.Replace(ServiceDescriptor.Transient<IControllerActivator,ServiceBasedControllerActivator>());
需要实现自定义实现
ConfigureContainer
方法,注意反射注入的方法需要写在这里面,不然没有效果代码如下
/// <summary>
/// AutoFac 自己会调用这个方法 进行注册
/// 1.负责注册 各种服务
/// 2.ServiceCollection 注册的,也同样是可以使用的
/// 3.还支持控制器 里面的属性注入
/// </summary>
/// <param name="builder"></param>
public void ConfigureContainer(ContainerBuilder builder)
{
Assembly serviceDLL = Assembly.Load(new AssemblyName("WebApplicationApi")); //1.Service 后缀类的反射 注入
var serviceTypes = serviceDLL.GetTypes().Where(t => t.Name.EndsWith("Service") && !t.GetTypeInfo().IsAbstract);
foreach (var serviceType in serviceTypes)
{
//var asdfasf = serviceType.Name;
foreach (var interType in serviceType.GetInterfaces())
{
var sname = serviceType.Name;
var Iname = interType.Name;
Console.WriteLine($"{sname}--->{Iname}");
builder.RegisterType(serviceType).As(interType).InstancePerDependency()
.AsImplementedInterfaces()//自动以其实现的所有接口类型暴露(包括IDisposable接口)
.InstancePerLifetimeScope()
.PropertiesAutowired();//支持属性注入的方法;
}
} //2 首先需要在Service,里面提供支持 services.Replace(.......)
//2.1 控制器实例的注入
var controllerTypes = typeof(Startup).GetTypeInfo().Assembly.DefinedTypes.
Where(x => x.IsClass && typeof(ControllerBase).GetTypeInfo().IsAssignableFrom(x)).
Select(x => x.AsType()).
ToArray();
builder.RegisterTypes(controllerTypes)
//支持属性注入的方法;
//CustomPropertySelector 设置哪些是可以被注入的 (指定特性属性注入的支持)
.PropertiesAutowired(new CustomPropertySelector()); }
这样就能直接在控制里面使用了
- 具体使用如下
- 具体使用如下
以上就是AutoFac的一些基本使用方法,欢迎大家讨论,转载请标明原创地址~ 谢谢~~~Bye~
.Net Core AutoFac 使用方法讲解大全,具体详细使用知识总结的更多相关文章
- ssh 配置文件讲解大全 ssh调试模式 sftp scp strace进行调试 特权分离
ssh 配置文件讲解大全 ssh调试模式 sftp scp strace进行调试 特权分离 http://blog.chinaunix.net/uid-16728139-id-3265394.h ...
- .net core Autofac IOC 容器的简单使用
书接上回,介绍了.net core 读取配置文件的几种方式,本文学习Autofac的同时再次增加一种读取配置文件的方法. 本文介绍Auofac,一个优秀的.NET IOC框架 源码地址:https:/ ...
- linux下生成core dump文件方法及设置
linux下生成core dump文件方法及设置 from:http://www.cppblog.com/kongque/archive/2011/03/07/141262.html core ...
- 【转】Nginx服务器的反向代理proxy_pass配置方法讲解
[转]Nginx服务器的反向代理proxy_pass配置方法讲解 转自:http://www.jb51.net/article/78746.htm 就普通的反向代理来讲Nginx的配置还是比较简单的, ...
- MySQL 升级方法指南大全
原文:MySQL 升级方法指南大全 通常,从一个发布版本升级到另一个版本时,我们建议按照顺序来升级版本.例如,想要升级 MySQL 3.23 时,先升级到 MySQL 4.0,而不是直接升级到 MyS ...
- AJAX方法讲解
Ajax的方法讲解 Ajax 异步请求,有点: 调高用户的体验度, 降低网络传输量 $.load() //异步加载页面 $.post() Post 异步请求 $.post("url请求地址 ...
- iOS7中UIView的animateKeyframesWithDuration方法讲解
iOS7中UIView的animateKeyframesWithDuration方法讲解 在iOS7中,给UIView添加了一个方法用来直接使用关键帧动画而不用借助CoreAnimation来实现,那 ...
- NSArray排序方法讲解
NSArray排序方法讲解 给数组排序有着多种方式 最麻烦的是sortedArrayUsingSelector:,其次是sortedArrayUsingDescriptors:,最容易使用的就是sor ...
- 007-对象—— static静态方法属性内存构成及使用方法讲解
<?php /* 7 对象 static静态方法属性内存构成及使用方法讲解 */ /*class a{ public $uname=11; static public function _a() ...
- core dump使用方法、设置、测试用例
core dump使用方法.设置.测试用例 http://blog.csdn.net/liuzhuchen/article/details/21975227
随机推荐
- win32 - 基于hwnd获取进程名字(GetModuleFileNameEx)
#include <Windows.h> #include <psapi.h> int main() { DWORD process_ID = 0; WCHAR process ...
- 串口通信RXTXcomm使用
一.串口通信原理 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节. 尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时 ...
- 硬件开发笔记(十): 硬件开发基本流程,制作一个USB转RS232的模块(九):创建CH340G/MAX232封装库sop-16并关联原理图元器件
前言 有了原理图,可以设计硬件PCB,在设计PCB之间还有一个协同优先动作,就是映射封装,原理图库的元器件我们是自己设计的.为了更好的表述封装设计过程,本文描述了CH340G和MAX232芯片封装 ...
- auth模块的一些方法
auth模块 auth模块是cookie和session的升级版,auth模块是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合的对象,而 ...
- ubuntu18.04下nginx配合fastdfs使用的安装和配置
前期准备 1.安装依赖包 # 新装的ubuntu缺少gcc编译,需要先安装这个 sudo apt-get install build-essential 1.解压缩 libfastcommon-mas ...
- EXE程序缺DLL怎么办
起因 工程师发给用户一个VS编译的windows应用程序,客户反应打不开,报缺少dll.可是dll明明就在当前目录啊,为什么还会报错呢? 那应该是该DLL依赖的其它DLL不存在导致的,用depends ...
- 【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)?
问题描述 App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)? 问题回答 App Service在Windows的环境中 ...
- 关于 LLM 和知识图谱、图数据库,大家都关注哪些问题呢?
自 LLM 系列文章<知识图谱驱动的大语言模型 Llama Index>.<Text2Cypher:大语言模型驱动的图查询生成>.<Graph RAG: 知识图谱结合 L ...
- 连接微信群、Slack 和 GitHub:社区开放沟通的基础设施搭建
NebulaGraph 社区如何构建工具让 Slack.WeChat 中宝贵的群聊讨论同步到公共领域. 要开放,不要封闭 在开源社区中,开放的一个重要意义是社区内的沟通.讨论应该是透明.包容并且方便所 ...
- STL-vector模拟实现
#pragma once #include<assert.h> #include<iostream> using std::cout; using std::endl; usi ...