当前位置: 首页 > 编程语言 > C#

Autofac与同一接口的多个实现共享

时间:2023-04-11 02:08:12 C#

Autofac与同一接口的多个实现我正在使用Autofac,并希望有多个接口实现。如何配置Autofac以便根据当前类型解析依赖项?更具体地说,我有一个接口和多个应该链接在一起的实现。让我解释一下(虚拟类):publicinterfaceIMessageHandler{voidHandle(Messagemessage);}publicclassLoggingMessageHandler:IMessageHandler{privateIMessageHandler_messageHandler;publicLoggingMessageHandler(IMessageHandlermessageHandler){_messageHandler=message}agepHandler({//记录一些东西_messageHandler.Handle(message);}}voidHandle(Messagemessage){//dosomething_messageHandler.Handle(message);}}在链的底部可能是一个不将消息传递给下一个的IMessageHandler。如果我想要以下链:TopLevelClass->LoggingMessageHandler->DoSomethingMessageHandler->FinalHandler如何告诉Autofac如果可能(我已经阅读了IEnumerable的隐式支持)?或者我是否必须在中间使用额外的类(工厂或其他东西)?Autofac有装饰器支持。对于其他人,我只是遇到了这个。您可以使用对IEnumerable的隐式支持。我把它写下来以备将来使用。基本上,您可以按名称(或其他条件)将程序集类型注册为IEnumerable,稍后可以使用。我最喜欢的方法是你可以不断添加消息处理程序,只要你坚持相同的标准,你就不必再触及标准了。Autofac注册:builder.RegisterAssemblyTypes(typeof(LoggingMessageHandler).Assembly).Where(x=>x.Name.EndsWith("MessageHandler")).AsImplementedInterfaces();消费者类:公共类Foo{privatereadonlyIEnumerable_messageHandlerspublicFoo(IEnumerablemessageHandlers){_messageHandlers=messageHandlers;}publicvoidBar(message){foreach(varhandlerin_messageHandlers){handler.Handle(message)}}}不太难。您可以将具体类型注册为self并在进行时解决它。然后,您可以为TopLevelClass将使用的接口注册一个顶级消息处理程序(在您的示例中为LoggingMessageHandler)(假设您有FinalHandler的默认构造函数)以上是C#学习教程:与同一个Autofac分享的所有接口的多种实现的内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注—varbuilder=newContainerBuilder();builder.RegisterType().AsSelf().SingleInstance();builder.Register(c=>newDoSomethingMessageHandler(c.Resolve())).AsSelf().SingleInstance();builder.Register(c=>newLoggingMessageHandler(c.Resolve())).As().SingleInstance();//现在终于是你的顶级类-这将自动选择你的LoggingMessageHandler因为其他人已经注册到他们的concreteTypesonlybuilder.RegisterType().As().InstancePerOwned();,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢