1 注册的概念和方式

使用autofac 的ContainerBuilder 来注册组件(components---通常指实现类),并把它的服务(service---通常指接口,抽象类,类实例)暴露给调用方。

autofac 通过相似的 Register() 方法来进行注册,通过As() 方法来公开服务

1) 创建一个ContainerBuilder 来注册组件和服务

 var builder = new ContainerBuilder();

2)  通过反射类型来进行注册 。

builder.RegisterType<ConsoleLogger>.As<ILogger>();

3)  通过一个实例来进行注册

var output = new StringWriter();
builder.RegisterInstance(output).As<TextWriter>();

如果用实例来注册,每次解析时,获得结果都是同一个实例。

builder.RegisterInstance(MyInstance.Instance).ExternallyOwned();  
ExternallyOwned() 方法配置组件不会被释放。

4) 通过Lamda表达式的方式来构建注册

// Register expressions that execute to create objects...
builder.Register(c => new ConfigReader("mysection")).As<IConfigReader>();

5) 通过RegisterGeneric()方法 支持泛型接口注册

//注册
builder.RegisterGeneric(typeof(List<>))
.As(typeof(IList<>))
.InstancePerLifetimeScope();
//解析代码
var tasks = container.Resolve<IList<String>>();

容器会自动根据传递的 T 类型 进行解析

6) 通过程序集进行注册

// 通过程序集进行注册
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces();

以上代码AsImplementedInterfaces() 方法 会把当前运行的程序集中所有实现了接口的组件进行注册,并把接口作为服务对外公开。

例如: 程序集中包含了 2个接口:IOutput 和 IDateWriter

和三个实现类:class ConsoleOutput : IOutput

class CurentDateWriter :IDateWriter

class MyComponent:IOutput,IDateWriter

那么这三个都会被注册。如果程序集中还有其他类型实现了接口,也会被自动注册,除了 IDisposable 接口。

7) 通过链式语法把一个组件注册为多个服务对外公开

// 链式注册
builder.RegisterType<MyComponent>()
.AsSelf() // 公开MyComponent 的实例
.As<IOutput>() // 公开IOutput 的 实例
.As<IDataWriter>(); // 公开 IDataWriter 的实例

所以如下三种解析都可以正常工作

// 都可以正常执行
scope.Resolve<IOutput>();
scope.Resolve<IDataWriter>();
scope.Resolve<MyComponent>();

2  条件注册

1) 注册时添加筛选条件

示例1:在程序集中,通过Where() 筛选名称以“Repository” 结尾的类进行注册,并制定服务进行公开

// asm 为一个程序集变量
builder.RegisterAssemblyTypes(asm)
.Where(t => t.Name.EndsWith("Repository"))
.As<IRepository>();

通过Where 提供Lamda 集合操作,可以对类进行筛选。

示例2 : 通过 Except() 方法排除不需要注册的类

//  排除 MyUnwantedType 不注册
builder.RegisterAssemblyTypes(asm)
.Except<MyUnwantedType>();

3  Autofac 构造函数注册

1)  当组件类有多个构造函数,通过RegisterType 方法注册的组件后,解析服务时,会通过反射形式,根据构造函数参数从多到少的方式匹配。

// 多构造函数组件
public class MyComponent
{
public string Name {get;set;}
public MyComponent() { Name = "no parameter"; }
public MyComponent(IOutput output) { Name = string.Format("parameter is {0}", output.ToString()); }
public MyComponent(IOutput output, IDateWriter writer) { Name = string.Format("parameter is {0} and {1}", output.ToString(),writer.ToString()); }
} class Program
{
static IContainer container { get; set; }
static void Main(string[] args)
{
var builder = new ContainerBuilder(); // 注册类型,通过反射注册
builder.RegisterType<MyComponent>();
builder.RegisterType<ConsoleOutput>().As<IOutput>(); container = builder.Build(); //构建容器 //使用
using (var scope = container.BeginLifetimeScope())
{
var component = container.Resolve<MyComponent>();
Console.WriteLine(component.GetType());
Console.WriteLine(component.Name);
} Console.ReadKey();
}
}
  • Autofac 根据上诉代码,在解析MyComponent 时,会先看容器中,是否有已注册的 ILoger 和IConfigReader 的 服务
  • Autofac 发现只有一个ILoger 服务,而没有 IConfigReader 的服务,于是自动选择 带一个ILoger 构造参数的 构造函数实例化 M

运行结果:

2) 通过UsingConstructor()指定构造函数注册

builder.RegisterType<MyComponent>()
.UsingConstructor(typeof(ILogger), typeof(IDataWriter));
  • 当容器中,存在ILoger 和IDataWriter  的 注册时,当Resolve<MyComponent> 时,容器会返回2个构造函数的实例
  • 当容器中,只存在Iloger  的注册时,因为是手动用2个构造函数进行祖册,此时Resolve<MyComponent> 会抛出异常,因为IDataWriter 的注册实例不存在。

4 Autofac 自动解析规则

1) 如果有多个组件注册,并以同一个服务对外公开,autofac 会取最后一个最后一个注册的组件,作为服务

builder.Register<ConsoleLogger>().As<ILogger>();
builder.Register<FileLogger>().As<ILogger>();

以上注册代码,FileLogger 组件会被默认公开,因为它是最后一个注册为ILogger 的服务。

5 为注册组件传递参数

下面有一个读取配置节点值的 类

public class ConfigReader : IConfigReader
{
public ConfigReader(string configSectionName)
{
// Store config section name
} // ...read configuration based on the section name.
}

1 )  通过Lamda表达式 传递参数

builder.Register(c => new ConfigReader("sectionName")).As<IConfigReader>();

“sectionName” 就是传递节点名称的值。

2 ) 通过方法WithParameters 传递参数

// Using a NAMED parameter:
builder.RegisterType<ConfigReader>()
.As<IConfigReader>()
.WithParameter("configSectionName", "sectionName"); // Using a TYPED parameter:
builder.RegisterType<ConfigReader>()
.As<IConfigReader>()
.WithParameter(new TypedParameter(typeof(string), "sectionName")); // Using a RESOLVED parameter:
builder.RegisterType<ConfigReader>()
.As<IConfigReader>()
.WithParameter(
new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(string) && pi.Name == "configSectionName",
(pi, ctx) => "sectionName"));

autofac 注册的更多相关文章

  1. Autofac注册组件详解

    注册概念:我们通过创建 ContainerBuilder 来注册 组件 并且告诉容器哪些 组件 暴露了哪些 服务.组件 可以通过 反射 创建; 通过提供现成的 实例创建; 或者通过 lambda 表达 ...

  2. 【反射】——Autofac 类型注册

    Autofac是.net界一款轻量化的IOC组件,使用Autofac可以帮助完成代码中很多依赖注入工作.在以前文章中,介绍过Autofac的配置过程(http://www.cnblogs.com/Jn ...

  3. EF6CodeFirst+MVC5+Autofac泛型注册 入门实例

    贴一个EF6 CodeFirst模式结合MVC5和Autofac(泛型注册)的一个入门实例 网上类似的例子实在太少,最近自己也有用到这一块的知识,总结了一下,不要让后人踩了自己踩过的坑. 1:新建三个 ...

  4. IoC之AutoFac(一)——简单使用和组件注册

    阅读目录 一.AutoFac简单使用 二.注册 2.1 注册方式 2.2 带参数注册 回到顶部 一.AutoFac简单使用 1 namespace AutofacDemo 2 { 3 class Pr ...

  5. .NET手记-Autofac进阶(注册的概念 Registering Concepts)

    通过创建ContainerBuilder并配置暴露的service(接口或者类型)来使用Autofac注册我们的组件. 组件(Components) 可以通过反射, 对象实例,或者lambda表达式来 ...

  6. AutoFac mvc和WebAPI 注册Service (接口和实现)

    AutoFac  mvc和WebAPI  注册Service (接口和实现) 1.准备组件版本:Autofac 3.5.0    Autofac.Integration.Mvc 3.3.0.0  (I ...

  7. Autofac官方文档翻译--一、注册组件--1注册概念

    官方文档:http://docs.autofac.org/en/latest/register/registration.html 一.注册概念 使用Autofac 注册组件,通过创建一个Contai ...

  8. IoC实践--用Autofac实现MVC5.0的IoC控制反转方法

    Autofac是一个.net平台下发性能还不错的IoC框架,利用它可以实现依赖注入和控制反转,使自己的软件模块之间的耦合性大大降低,让软件扩展.维护更加容易.控制反转(Inversion of Con ...

  9. 多层架构+MVC+EF+AUTOFAC+AUTOMAPPER

    最近使用ligerui搭建了一个简单的教务管理demo,将重要的地方记录,也希望能帮到有这方面需要园友. 一.目录 1.多层架构+MVC+EF+AUTOFAC+AUTOMAPPER: 2.MVC中验证 ...

随机推荐

  1. ObjectHeader、ObjectType和ObjectHook的学习

    0x01 前言 之前研究RootKit技术,发现了对象钩子这个概念,一直不知道是什么,然后在网上搜,最先找到的是sudami的一篇文章,于是跟着大牛的脚步研究,其中也参考<内核情景分析>, ...

  2. OpenLayers3之ol.control.ZoomToExtent

    controls: ol.control.defaults().extend([new ol.control.ZoomToExtent({ extent:[Number(box[]), Number( ...

  3. URAL 1252 ——Sorting the Tombstones——————【gcd的应用】

    Sorting the Tombstones Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I ...

  4. 【VMware】无法连接MKS:套接字连接尝试次数太多;正在放弃

    启动我的电脑 -> 右键 -> 管理 -> 服务和应用程序 -> 服务: 将当前服务全部进行启动

  5. 【PPTP】windows & linux 安装pptp

    1.Windows下安装 PPTP 打开网络和共享中心 更改适配器配置 按一下alt,之后,点击左上角的文件---->新建传入连接 在新建传入连接这边点击添加用户 如输入用户名:Evelyn  ...

  6. 【shell】《shell学习指南》读书笔记

    一.使用shell脚本 优点:脚本语言能够轻易处理文件与目录之间的对象,如把文件从所有目录拷贝到另一个目录 缺点:效率不如编译型语言 二.简单的脚本 1.查看现在系统有谁登录 $who 2.算出行数 ...

  7. [转]NLog学习笔记二:深入学习

    本文转自:http://www.cnblogs.com/CCHUncle/p/5207735.html 配置文件 NLog所有的配置信息都可以写到一个单独的xml文件中,也可以在程序代码中进行配置. ...

  8. 项目搭建系列之三:SpringMVC框架下使用Ehcache对象、数据缓存

    注明:该文章为以前写的文章,这里只更改了标题,无GitHub源码下载. 一.准备工作 如果已经成功搭建SpringMVC环境,那么就可以进入Ehcache的准备工作了.1.下载jar包    Ehca ...

  9. 用AJAX实现页面登陆以及注册用户名验证

     AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.        AJAX 是一种用于创建快 ...

  10. 运行jsp时,报错404

    The origin server did not find a current reprsentation for the target resource or is not willing to ...