作者:拍友2502869293 | 来源:互联网 | 2024-10-17 14:27
上面代码通过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注册的原因之一。