热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IoC容器Autofac正篇之类型关联(服务暴露)(八)

上面代码通过ResolveI()获取到C1类型实例。注意c1需要实现或继承I这里说的一个接口不能关联多个类型,是针对这种常用的注册及关联。其实可以通过Named、Meta这

上面代码通过Resolve I ()获取到C1类型实例。注意c1需要实现或继承I

这里说的一个接口不能关联多个类型,是针对这种常用的注册及关联。其实可以通过Named 、Meta 这种方式进行多关联

b.一个接口与多个类型关联

builder.RegisterType Worker ().Named IPerson ("worker");

builder.RegisterType Student ().Named IPerson ("student");

使用Name可以检索服务创建实例:

IPerson p = container.ResolveNamed IPerson ("worker");

ResolveNamed()只是Resolve()的简单重载,指定名字的服务其实是指定键的服务的简单版本。

c.键

 有Name的方式很方便,但是值支持字符串,但有时候我们可能需要通过其他类型作键。

例如,使用枚举作为key:

public enum DeviceState { Worker, Student }

使用key注册服务,通过Keyed T ()方法:

builder.RegisterType Student ().Keyed IPerson (DeviceState.Student);

IIndex索引

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

builder.RegisterType Student ().Keyed IPerson (DeviceState.Student);
using (IContainer cOntainer= builder.Build())
IIndex DeviceState, IPerson IIndex = container.Resolve IIndex DeviceState, IPerson ();
IPerson p = IIndex[DeviceState.Student];
p.Say(); //输出我是一个学生
}

IIndex中第一个泛型参数要跟注册时一致,在例子中是DeviceState枚举。其他两种注册方法没有这样的索引查找功能,这也是为什么设计者推荐Keyed注册的原因之一。


推荐阅读
author-avatar
拍友2502869293
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有