依赖注入之AutoFac
一 、IoC框架AutoFac简介
IoC即控制反转(Inversion of Control),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
控制反转背后的核心思想是, 我们不再将类绑定在应用里,让类自己去 "new up" 他们的依赖, 而是反过来在类的构造方法中将依赖传递进去,而类的创建工作统一交给容器Container处理.
二 、Autofac使用的基本流程
- 按照 控制反转 (IoC) 的思想构建你的应用.
- 添加Autofac引用.
- 在应用的 startup 处...
- 创建 ContainerBuilder.
- 注册组件.
- 创建容器,将其保存以备后续使用.
- 从容器中创建一个生命周期.
- 在此生命周期作用域内解析组件实例.
三 、Autofac术语
| Term | Meaning |
|---|---|
| Activator(激活器) | 注册 中的一部分, 提供一个 上下文 和一组 参数, 可以创建一个绑定于该 上下文 的 组件实例 |
| Argument(形参) | 一个构造函数的 .NET 类型形参 |
| Component(组件) | 一串声明了它所提供 服务 和它所消费 依赖 的代码 |
| Instance(实例) | 通过 Activating(激活) 一个在 容器 (也可以是 组件实例 )中提供 服务 的 组件 , 来获得的一个.NET对象 |
| Container(容器) | 管理组成应用的 组件 的一种结构 |
| Context(上下文) | 一块界定的区域, 在其中特定的一组 服务 是可用的 |
| Dependency(依赖) | 一个被 组件 需要的 服务 |
| Lifetime(生命周期) | 从 实例 的 激活 到 释放 的持续时间 |
| Parameter(实参) | 用来配置一个 组件 的非 服务 对象 |
| Registration(注册) | 添加和配置 组件 到 容器 的行为, 和与此过程相关的信息 |
| Scope(作用域) | 一个特定的 上下文 , 在其中 组件 的 实例 将会被其他 组件 依据它们的 服务 所共享 |
| Service(服务) | 一个在提供和消费 组件 之间明确定义的行为约定 |
四 、Autofac使用简单举例
写代码前首先将Autofac的引用添加进项目,可以从NuGet上直接下载;
以下代码演示了注册Pig及Person类及对应IAnimal,Person和IPerson服务到容器中,然后调用Person服务的解析(相当于实例化),最后成功调用Person的给动物喂食的方法FeedAnimal
using System; namespace AutoFacTest
{
public interface IAnimal
{
void Eat(); void Run();
} public class Pig : IAnimal
{
public void Eat()
{
Console.WriteLine("pig eat");
} public void Run()
{
Console.WriteLine("pig run");
}
} public interface IPerson
{
void FeedAnimal();
} public class Person : IPerson
{
IAnimal ianimal; public Person(IAnimal animal)
{
this.ianimal = animal;
} public void FeedAnimal()
{
ianimal.Eat();
}
}
}
using Autofac; namespace AutoFacTest
{
class Program
{
private static IContainer Container { get; set; }
static void Main(string[] args)
{
// 创建容器
var builder = new ContainerBuilder();
// 注册组件并暴露相应服务
// 注册Pig类,将IAnimal作为服务
builder.RegisterType<Pig>().As<IAnimal>(); // 注册Person类,将Person及IPerson作为服务
builder.RegisterType<Person>().AsSelf().As<IPerson>(); //直接构建容器
using (Container = builder.Build())
{
// 通过注册的IPerson服务创建Person解析(相当于实例化)
var person = Container.Resolve<IPerson>();
person.FeedAnimal();
}
//有时在我们的应用中也许可以从根容器中解析组件, 然而这么做有可能会导致内存泄漏.所以还可以
//using (var scope = container.BeginLifetimeScope())
//{
// var service = scope.Resolve<IPerson>();
//}
} }
}
五 、常用方法
1. builder.RegisterType<Object>().As<Iobject>():注册类型及其实例。
2. IContainer.Resolve<IDAL>():解析某个接口的实例。
3. builder.RegisterType<Object>().Named<Iobject>(string name):为一个接口注册不同的实例。有时候难免会碰到多个类映射同一个接口,比如SqlDAL和OracleDAL都实现了IDAL接口,为了准确获取想要的类型,就必须在注册时起名字。
4. IContainer.ResolveNamed<IDAL>(string name):解析某个接口的“命名实例”。例如上面的最后一行代码就是解析IDAL的命名实例OracleDAL
5. builder.RegisterType<Object>().Keyed<Iobject>(Enum enum):以枚举的方式为一个接口注册不同的实例。
6. IContainer.ResolveKeyed<IDAL>(Enum enum):根据枚举值解析某个接口的特定实例。
7. builder.RegisterType<Worker>().InstancePerDependency():用于控制对象的生命周期,每次加载实例时都是新建一个实例,默认就是这种方式
8. builder.RegisterType<Worker>().SingleInstance():用于控制对象的生命周期,每次加载实例时都是返回同一个实例
9. IContainer.Resolve<T>(NamedParameter namedParameter):在解析给实例T时传参
参考:https://www.cnblogs.com/WeiGe/p/3871451.html
https://autofaccn.readthedocs.io/zh/latest/getting-started/index.html
依赖注入之AutoFac的更多相关文章
- 大比速:remoting、WCF(http)、WCF(tcp)、WCF(RESTful)、asp.net core(RESTful) .net core 控制台程序使用依赖注入(Autofac)
大比速:remoting.WCF(http).WCF(tcp).WCF(RESTful).asp.net core(RESTful) 近来在考虑一个服务选型,dotnet提供了众多的远程服务形式.在只 ...
- ASP.NET MVC IOC依赖注入之Autofac系列(二)- WebForm当中应用
上一章主要介绍了Autofac在MVC当中的具体应用,本章将继续简单的介绍下Autofac在普通的WebForm当中的使用. PS:目前本人还不知道WebForm页面的构造函数要如何注入,以下在Web ...
- ASP.NET MVC IOC依赖注入之Autofac系列(一)- MVC当中应用
话不多说,直入主题看我们的解决方案结构: 分别对上面的工程进行简单的说明: 1.TianYa.DotNetShare.Model:为demo的实体层 2.TianYa.DotNetShare.Repo ...
- 依赖注入容器Autofac的详解
Autofac和其他容器的不同之处是它和C#语言的结合非常紧密,在使用过程中对你的应用的侵入性几乎为零,更容易与第三方的组件集成,并且开源,Autofac的主要特性如下: 1,灵活的组件实例化:Aut ...
- 依赖注入容器Autofac与MVC集成
Autofac是应用于.Net平台的依赖注入(DI,Dependency Injection)容器,具有贴近.契合C#语言的特点.随着应用系统的日益庞大与复杂,使用Autofac容器来管理组件之间的关 ...
- 依赖注入之Autofac使用总结
依赖倒置?控制反转(IOC)? 依赖注入(DI)? 你是否还在被这些名词所困扰,是否看了大量理论文章后还是一知半解了? 今天我想结合实际项目,和正在迷惑中的新手朋友一起来学习和总结依赖注入Autofa ...
- webapi框架搭建-依赖注入之autofac
前言 c#的依赖注入框架有unity.autofac,两个博主都用过,感觉unity比较简单而autofac的功能相对更丰富(自然也更复杂一点),本篇将基于前几篇已经创建好的webapi项目,引入au ...
- 依赖注入(二)Autofac简单使用
Autofac简单使用 源码下载传上源码,终于学会传文件了. 首先 还是那句话:“不要信我,否则你死得很惨!”. C#常见的依赖注入容器 IoC in .NET part 1: Autofac IoC ...
- 深入浅出依赖注入容器——Autofac
1.写在前面 相信大家对IOC和DI都耳熟能详,它们在项目里面带来的便利大家也都知道,微软新出的.NetCore也大量采用了这种手法. 如今.NetCore也是大势所趋了,基本上以.Net为技术主导的 ...
随机推荐
- Go语言中的defer
可以用作一些资源的释放. 1.在一个函数内的defer执行顺序是先写的后执行,后写的先执行(遵循栈结构) func DeferTest1(){ defer fmt.Println("我是 d ...
- 正则表达式匹配IP地址
'''首先分析ip地址的特征:255.255.255.255,前三位的数字处理基本一致 1位: 0-9 \d2位:10-99 [1-9]\d3位:100-19 ...
- 深入理解flex布局的flex-grow、flex-shrink、flex-basis
flex-basis用来设置初始的宽度(或者高度),优先级高于width flex-grow用来设置flex容器内 当还有剩余宽度(或高度)时, 子元素的缩放比例. 同理 flex-shrink 用来 ...
- Vue结合后端DjangoFramework的在线生鲜超市(前后端分离)【django2.2+xadmin+ueditor】
在线博客教程:https://www.cnblogs.com/Eric15/category/1300432.html https://www.cnblogs.com/derek1184405959/ ...
- Spring自动注入Bean
通过@Autowired或@Resource来实现在Bean中自动注入的功能,但还要在配置文件中写Bean定义,下面我们将介绍如何注解Bean,从而从XML配置文件 中完全移除Bean定义的配置. 1 ...
- 9、Spring Boot 2.x 集成 Thymeleaf
1.9 Spring Boot 2.x 集成 Thymeleaf 完整源码: Spring-Boot-Demos 1.9.1 在pom中引入依赖 <dependency> <grou ...
- Oracle 数据库SQL审计
在我们日常的工作中,一些安全性的要求高的数据库需要增加审计操作,哪个用户什么时间做了什么操作. 1.打开数据库的审计 alter system set audit_sys_operations=TRU ...
- LibreOJ #102. 最小费用流
二次联通门 : LibreOJ #102. 最小费用流 /* LibreOJ #102. 最小费用流 Spfa跑花费 记录路径 倒推回去 */ #include <cstring> #in ...
- 将.mat文件中的数据转换成图片
%% 如何将.mat文件中的数据转换成图片 clc;clear all; addpath F_data/MAT;load('D:\face.mat') for i=1:q img=uint8(re ...
- 关于lda算法的一个博客
http://www.cnblogs.com/LeftNotEasy/archive/2011/01/08/lda-and-pca-machine-learning.html