一 、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

  1. using System;
  2.  
  3. namespace AutoFacTest
  4. {
  5. public interface IAnimal
  6. {
  7. void Eat();
  8.  
  9. void Run();
  10. }
  11.  
  12. public class Pig : IAnimal
  13. {
  14. public void Eat()
  15. {
  16. Console.WriteLine("pig eat");
  17. }
  18.  
  19. public void Run()
  20. {
  21. Console.WriteLine("pig run");
  22. }
  23. }
  24.  
  25. public interface IPerson
  26. {
  27. void FeedAnimal();
  28. }
  29.  
  30. public class Person : IPerson
  31. {
  32. IAnimal ianimal;
  33.  
  34. public Person(IAnimal animal)
  35. {
  36. this.ianimal = animal;
  37. }
  38.  
  39. public void FeedAnimal()
  40. {
  41. ianimal.Eat();
  42. }
  43. }
  44. }
  1. using Autofac;
  2.  
  3. namespace AutoFacTest
  4. {
  5. class Program
  6. {
  7. private static IContainer Container { get; set; }
  8. static void Main(string[] args)
  9. {
  10. // 创建容器
  11. var builder = new ContainerBuilder();
  12. // 注册组件并暴露相应服务
  13. // 注册Pig类,将IAnimal作为服务
  14. builder.RegisterType<Pig>().As<IAnimal>();
  15.  
  16. // 注册Person类,将Person及IPerson作为服务
  17. builder.RegisterType<Person>().AsSelf().As<IPerson>();
  18.  
  19. //直接构建容器
  20. using (Container = builder.Build())
  21. {
  22. // 通过注册的IPerson服务创建Person解析(相当于实例化)
  23. var person = Container.Resolve<IPerson>();
  24. person.FeedAnimal();
  25. }
  26. //有时在我们的应用中也许可以从根容器中解析组件, 然而这么做有可能会导致内存泄漏.所以还可以
  27. //using (var scope = container.BeginLifetimeScope())
  28. //{
  29. // var service = scope.Resolve<IPerson>();
  30. //}
  31. }
  32.  
  33. }
  34. }

五 、常用方法

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的更多相关文章

  1. 大比速: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提供了众多的远程服务形式.在只 ...

  2. ASP.NET MVC IOC依赖注入之Autofac系列(二)- WebForm当中应用

    上一章主要介绍了Autofac在MVC当中的具体应用,本章将继续简单的介绍下Autofac在普通的WebForm当中的使用. PS:目前本人还不知道WebForm页面的构造函数要如何注入,以下在Web ...

  3. ASP.NET MVC IOC依赖注入之Autofac系列(一)- MVC当中应用

    话不多说,直入主题看我们的解决方案结构: 分别对上面的工程进行简单的说明: 1.TianYa.DotNetShare.Model:为demo的实体层 2.TianYa.DotNetShare.Repo ...

  4. 依赖注入容器Autofac的详解

    Autofac和其他容器的不同之处是它和C#语言的结合非常紧密,在使用过程中对你的应用的侵入性几乎为零,更容易与第三方的组件集成,并且开源,Autofac的主要特性如下: 1,灵活的组件实例化:Aut ...

  5. 依赖注入容器Autofac与MVC集成

    Autofac是应用于.Net平台的依赖注入(DI,Dependency Injection)容器,具有贴近.契合C#语言的特点.随着应用系统的日益庞大与复杂,使用Autofac容器来管理组件之间的关 ...

  6. 依赖注入之Autofac使用总结

    依赖倒置?控制反转(IOC)? 依赖注入(DI)? 你是否还在被这些名词所困扰,是否看了大量理论文章后还是一知半解了? 今天我想结合实际项目,和正在迷惑中的新手朋友一起来学习和总结依赖注入Autofa ...

  7. webapi框架搭建-依赖注入之autofac

    前言 c#的依赖注入框架有unity.autofac,两个博主都用过,感觉unity比较简单而autofac的功能相对更丰富(自然也更复杂一点),本篇将基于前几篇已经创建好的webapi项目,引入au ...

  8. 依赖注入(二)Autofac简单使用

    Autofac简单使用 源码下载传上源码,终于学会传文件了. 首先 还是那句话:“不要信我,否则你死得很惨!”. C#常见的依赖注入容器 IoC in .NET part 1: Autofac IoC ...

  9. 深入浅出依赖注入容器——Autofac

    1.写在前面 相信大家对IOC和DI都耳熟能详,它们在项目里面带来的便利大家也都知道,微软新出的.NetCore也大量采用了这种手法. 如今.NetCore也是大势所趋了,基本上以.Net为技术主导的 ...

随机推荐

  1. Anaconda配置Python开发环境

    Anaconda介绍 Anaconda 是在 linux.windows 和 mac os x 上执行 Python/R 数据分析和机器学习的最简单的方式并且它是开源的.它在全球拥有超过 1, 100 ...

  2. Oracle 按一行里某个字段里的值分割成多行进行展示

    with t as ( select '111,222,333' col from dual union all select '444,555,666' col from dual ) , leve ...

  3. BZOJ 5496: [2019省队联测]字符串问题 (后缀数组+主席树优化建图+拓扑排序)

    题意 略 分析 考场上写了暴力建图40分溜了-(结果只得了30分) 然后只要优化建边就行了 首先给出的支配关系无法优化,就直接A向它支配的B连边. 考虑B向以B作为前缀的所有A连边,做一遍后缀数组,两 ...

  4. Flutter布局3-----Center

    Center 居中的布局 只能有一个chlid,但是可以用container包含好多子child,继承自Align. 用于将其子项与其自身对齐,并根据子级的大小自行调整大小. 如果它的尺寸受到约束且[ ...

  5. 利用chrome console批量下载文件

    因工作需要,需要定期从某页面下载多个文档,是体力活. 想用chrome扩展,找了几个不行.原因是: 1.有的扩展识别不了链接,因为链接是形如:jsp?XXX=XXX的形式 2.有的扩展能批量打开链接, ...

  6. BZOJ 4025 二分图 LCT维护最大生成树

    怎么说呢,我也不知道该咋讲,你就手画一下然后 yy 一下就发现这么做是对的. 为什么我明明都想出来了,却还是讲不出来啊~ #include <cstdio> #include <ve ...

  7. [Luogu] 让我们异或吧

    https://www.luogu.org/problemnew/show/P2420 异或满足 A ^ B = B ^ A A ^ A = 0 0 ^ A = A #include <cstd ...

  8. 「CF716D」Complete The Graph「最短路」

    题意 给定一个\(n\)个点\(m\)条边的无向图,有一些边权暂时为\(0\),你需要分配一个\([1, 10^{18}]\)的数.最终使得\(s\)到\(t\)最短路为\(L\),输出一个可行的分配 ...

  9. 学密码学一定得学程序(SDUT 2463)

    Problem Description 曾经,ZYJ同学非常喜欢密码学.有一天,他发现了一个很长很长的字符串S1.他很好奇那代表着什么,于是神奇的WL给了他另一个字符串S2.但是很不幸的是,WL忘记跟 ...

  10. jenkins之插件下载失败

    1.更换地址 将默认地址 http://updates.jenkins-ci.org/update-center.json 改为 http://mirrors.jenkins-ci.org/statu ...