目录

  1. 开始
  2. Registering components
  3. 控制范围和生命周期
  4. 用模块结构化Autofac
  5. xml配置
  6. 与.net集成
  7. 深入理解Autofac
  8. 指导
  9. 关于
  10. 词汇表

服务类型,名称和键

同一个服务的不同实现可以以类型,名称和键区分。

autofac提供三种典型的方式区分服务。

按类型

类型是描述服务的基本方法

1
builder.Register<OnlineState>().As<IDeviceState>();

这个例子将IDeviceState 类型的服务和OnlineState 的component联系起来。可以用这个服务的类型来检索OnlineState的实例:

1
var r = container.Resolve<IDeviceState>();

指定类型的服务在自动装配中也会起作用。

按名字

服务可以进一步按名字识别。使用这种技术时,用 Named()注册方法代替As():

1
builder.Register<OnlineState>().Named<IDeviceState>("online");

使用 ResolveNamed()检索指定名字的服务:

1
var r = container.ResolveNamed<IDeviceState>("online");

在之前的2.3版本中,ResolveNamed()只是Resolve()的简单重载。

指定名字的服务其实是指定键的服务的简单版本,所以在下一节讲到的技术也同样适用于指定名字的服务。

按键

在一些情况下使用字符串做component的名字很方便,但是在另外一些情况下我们需要使用其他类型做键。按键指定服务提供了这种机制。

比如,使用一个枚举来描述设备的不同状态

1
public enum DeviceState { Online, Offline }

每个枚举值对应一个服务的实现。

1
public class OnlineState : IDeviceState { }

可以像下面这样使用枚举值来做键

1
2
3
4
var builder = new ContainerBuilder();
builder.RegisterType<OnlineState>().Keyed<IDeviceState>(DeviceState.Online);
builder.RegisterType<OfflineState>().Keyed<IDeviceState>(DeviceState.Offline);
// Register other components here

显式检索

可以使用ResolveKeye()进行显式检索。

1
var r = container.ResolveKeyed<IDeviceState>(DeviceState.Online);

这么做导致容器被当做 Service Locator使用,这是不被推荐的。应该使用IIndex type替代。

在之前的2.3版本中, ResolveKeyed()只是Resolve()的简单重载。

使用索引检索

Autofac.Features.Indexed.IIndex<K,V>是autofac自动实现的一个关联类型。component可以使用IIndex<K,V>作为参数的构造函数从基于键的服务中选择需要的实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Modem : IHardwareDevice
{
    IIndex<DeviceState, IDeviceState> _states;
    IDeviceState _currentState;
 
    public Modem(IIndex<DeviceState, IDeviceState> states)
    {
         _states = states;
        SwitchOn();
    }
 
    void SwitchOn()
    {
         _currentState = _states[DeviceState.Online];
    }
}

在SwitchOn方法中。使用索引从前面用DeviceState.Online做键注册的IDeviceState的实现。

AutoFac文档3(转载)的更多相关文章

  1. AutoFac文档(转载)

    目录 开始 注册组件 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 开始 程序集 如果你正在使用Nuget包管理器,你可以通过 ...

  2. 使用swagger实现web api在线接口文档(转载)

    一.前言 通常我们的项目会包含许多对外的接口,这些接口都需要文档化,标准的接口描述文档需要描述接口的地址.参数.返回值.备注等等:像我们以前的做法是写在word/excel,通常是按模块划分,例如一个 ...

  3. 如何从sun公司官网下载java API文档(转载)

    相信很多同人和我一样,想去官网下载一份纯英文的java API文档,可使sun公司的网站让我实在很头疼,很乱,全是英文!所以就在网上下载了别人提供的下载!可是还是不甘心!其实多去看看这些英文的技术网站 ...

  4. AutoFac文档14(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 激活事件 在compo ...

  5. AutoFac文档13(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 属性注入 属性注入使用 ...

  6. AutoFac文档12(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 Resolve的参数 ...

  7. AutoFac文档11(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 元数据 Autofac ...

  8. AutoFac文档10(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 循环依赖 循环依赖是指 ...

  9. AutoFac文档9(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 关系类型 Autofa ...

  10. AutoFac文档8(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 泛型 给定一个开放的泛 ...

随机推荐

  1. 创建自己的Repo Server

    非常久曾经出于好奇细致了解了下Repo及server的原理,可是今天突然发现有些忘了.于是想记录下来. Repo机制 Repo是google官方为管理Android项目开发出来的一个软件. 我们先来看 ...

  2. 《转》OpenStack Ceilometer 安装配置和API说明

    1.概述 Ceilometer是OpenStack中的一个子项目.它像一个漏斗一样.能把OpenStack内部发生的差点儿全部的事件都收集起来,然后为计费和监控以及其他服务提供数据支撑.Ceilome ...

  3. Socket INADDR_ANY详解

    转载:http://hi.baidu.com/zorro_knight/item/37af9e8c9dc71253e73d1924 linux下的socket INADDR_ANY表示的是一个服务器上 ...

  4. 【微信小程序】在js中导入第三方js或自己写的js,使用外部js中的function的两种方法 import和require的区别使用方法 【外加:使用第三方js导出的默认function的调用方法】

    如下 定义了一个外部js文件,其中有一个function import lunaCommon from '../lunaCommon.js'; var ctx = wx.getStorageSync( ...

  5. 【GISER&&Painter】Chapter02:WebGL中的模型视图变换

    上一节我们提到了如何在一张画布上画一个简单几何图形,通过创建画布,获取WebGLRendering上下文,创建一个简单的着色器,然后将一些顶点数据绑定到gl的Buffer中,最后通过绑定buffer数 ...

  6. IIS - 无后缀(无扩展名)的MIME类型配置

    添加一个新的 MIME 类型即可. 文件扩展名:. MIME类型:application/octet-stream

  7. Django练习

    实现功能: 登录功能 添加功能 删除功能(未实现) 代码: index.html <!DOCTYPE html> <html lang="en"> < ...

  8. 为什么Domain controller上的time synchronization非常重要?

    虚拟机默认情况下所拥有的资源都是不同的, 比如说CPU clock. 在一个忙碌的系统中, 虚拟机甚至可能在很短的一段时间内被拒绝分配资源给它, 这种情况还可能发生在高系统负荷, VMotion, B ...

  9. FormBorderStyle为None的时候如何拖动窗体

    //为DllImport导出命名空间, using System.Runtime.InteropServices; public partial class Form1 : System.Window ...

  10. MYSQL获取自增主键【4种方法】(转)

    转自:http://blog.csdn.net/ultrani/article/details/9351573 作者已经写的非常好了,我不废话了,直接转载收藏: 通常我们在应用中对mysql执行了in ...