【发布时间】:2011-12-22 06:24:24
【问题描述】:
最近,Castle 通过内核提供的实现增加了对接口工厂的支持。我想知道是否也有办法在 autofac 中做到这一点。我已经阅读了有关委托工厂的信息,但我认为我可能遗漏了一些东西,并且无法使其正常工作。这是我的想法:
class Message { }
interface IHandle<T> {
void Handle(T message);
}
class Handle<Message> : IHandle<Message> {
...
}
class Bus {
.ctor (? lookup) {
_lookup = lookup;
}
void Send<T>(T message) {
_lookup.GetHandler<T>().Handle(message);
}
}
var builder = new ContainerBuilder();
builder.RegisterType<Handle<Message>>().As<IHandle<Message>>();
builder.RegisterType<Bus>();
var container = builder.Build();
container.Resolve<Bus>().Send<Message>(new Message());
我想要做的是让容器远离总线(因为我同意服务定位器是一种反模式)或任何其他实现。如果我只是将容器提供给总线,或者创建一些包装容器的类工厂,这个问题很容易。只是想确保没有办法做到这一点。
顺便说一句,城堡之路iirc允许我注册这样的东西:
interface IHandlerFactory {
IHandle<T> GetHandler<T>();
}
container.Register<IHandlerFactory>().AsFactory();
谢谢, 尼克
【问题讨论】:
-
Castle 方法看起来非常聪明——Autofac 不支持这一点。我认为@kcalvanti 下面的方法最适合这种情况,但是您也可以使用 Autofac 的
IIndex<K,V>类型达到类似的效果,但需要更多配置。 -
@NicholasBlumhardt 是的,我现在要接受他的回答。如果以后有变化,我绝对可以重温。