AutofacGeneralServiceAnalysisatRuntime最近Castle通过内核提供的实现增加了对接口工厂的支持。我想知道是否有办法在autofac中做同样的事情。我读过有关委托工厂的信息,但我认为我可能遗漏了一些东西并且无法让它工作。这就是我的想法:classMessage{}interfaceIHandle{voidHandle(Tmessage);}classHandle:IHandle{...}classBus{.ctor(?lookup){_lookup=lookup;}voidSend(Tmessage){_lookup.GetHandler().Handle(message);}}varbuilder=newContainerBuilder();builder.RegisterType().As();builder.RegisterType();变种容器=建设者。建造();container.Resolve().Send(newMessage());我想要做的是将容器从总线上取下来(因为我同意服务定位器是一种反模式)或任何其他实现。如果我只是将容器提供给总线,或者创建一个包装容器的类工厂,这个问题就很容易了。只是想确保没有办法做到这一点。顺便说一句,城堡方式iirc允许我注册这样的东西:interfaceIHandlerFactory{IHandleGetHandler();}container.Register().AsFactory();谢谢,Nick您可以通过创建一个具体的IHandlerFactory来隔离该耦合,例如将接收ILifetimeScope的AutofacHandlerFactory。这种耦合似乎是不可避免的,因为容器是唯一可以解析正确IHandler的容器。与ILifetimeScope耦合可能不是一个好主意,但是,耦合在具体的IHandlerFactory中是隔离的,总线只是通过接口使用它。假设您更改容器并开始使用Ninject,您可以实施NinjectHandlerFactory来完成这项工作。似乎答案是“不”。我试过使用AggregateService应该做你想做的事,但它在工厂解析期间崩溃,并显示消息'Thetype'Castle.Proxies.IComponentFactoryProxy"fromassembly"DynamicProxyGenAssembly2,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null"An试图实现无法访问的接口。”(原始消息是俄语,我已经翻译了)。如果没有手动(但非常简单)实施,我想不出另一种可行的方法。也许你应该写信给NicholasBlumhardt。事实上,我最好这样做:publicclassBus{readonlyILifetimeScope_OwnScope;//Autofac始终提供拥有组件的ILifetimeScope作为组件的服务//因此它可以用作依赖项publicBus(ILifetimeScopeownScope){_OwnScope=ownScope;}voidSend(Tmessage){_OwnScope.Resolve>.Handle(message);您可能认为与ILifetimeScope耦合是个坏主意。嗯,这是一个非常简单的接口,可以包含在您自己的实现中。或者您可以将代码分解为简单的工厂类。好吧,看来你不用我的建议就知道怎么做了。以上就是C#学习教程:Autofac通用服务解析与运行时分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: