运行时Autofac通用服务解析

最近,Castle通过内核提供的实现添加了对接口工厂的支持。 我想知道是否有办法在autofac中也这样做。 我已经阅读过委托工厂,但我想我可能会遗漏一些东西,而且无法让它工作。 这就是我的想法:

class Message { } interface IHandle { void Handle(T message); } class Handle : IHandle { ... } class Bus { .ctor (? lookup) { _lookup = lookup; } void Send(T message) { _lookup.GetHandler().Handle(message); } } var builder = new ContainerBuilder(); builder.RegisterType<Handle>().As<IHandle>(); builder.RegisterType(); var container = builder.Build(); container.Resolve().Send(new Message()); 

我要做的是将容器从公共汽车中取出(因为我同意服务定位器是反模式)或任何其他实现。 如果我只是将容器提供给总线,或者创建一个包装容器的类工厂,这个问题很容易。 只是想确保没有办法做到这一点。

顺便说一句,城堡方式iirc允许我注册这样的东西:

 interface IHandlerFactory { IHandle GetHandler(); } container.Register().AsFactory(); 

谢谢,尼克

您可以通过创建一个具体的IHandlerFactory来隔离该耦合,比如AutofacHandlerFactory ,它将接收ILifetimeScope 。 这种耦合似乎是不可避免的,因为容器是唯一可以解析正确的IHandler

ILifetimeScope耦合可能是个坏主意,但是,耦合在具体的IHandlerFactory被隔离,而Bus只是通过接口使用它。 假设你改变了容器并开始使用Ninject,你可以实现一个NinjectHandlerFactory来完成这项工作。

似乎答案是“不”。

我曾尝试使用AggregateService本应该做你想要的,但它在工厂解析期间崩溃,消息’The type’Castle.Proxies.IComponentFactoryProxy“from assembly”DynamicProxyGenAssembly2,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null“试图实现一个无法访问的接口。” (最初的信息是俄语,我已经翻译过了)。

我想不出另一种方法,如果没有手动(但非常简单)的实现,它将工作。 也许你应该写信给Nicholas Blumhardt。

事实上,我最好这样做:

 public class Bus { readonly ILifetimeScope _OwnScope; // Autofac always provides ILifetimeScope that owns a component as a service to the component // so it can be used as a dependency public Bus(ILifetimeScope ownScope) { _OwnScope = ownScope; } void Send(T message) { _OwnScope.Resolve>.Handle(message); } } 

您可能会认为与ILifetimeScope耦合是一个坏主意。 嗯,这是一个非常简单的界面,可能会包含在您自己的实现中。 或者您可以将代码分解为简单的工厂类。 好吧,似乎你知道如何在没有我的建议的情况下做到这一点。