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

structuremap-同一接口的两个实现共享

时间:2023-04-11 10:54:41 C#

structuremap-同一接口的两个实现(电子邮件和短信)。如何配置容器以正确解析此构造函数?这是命名实例的用武之地,还是另一种情况?您可以使用命名实例或智能实例来解决此问题...//命名实例this.For().Use().Named("emailService");this.For().Use().Named("短信服务");//智能实例varemailService=this.For().Use();varsmsService=For().Use();this.For().Use().Ctor("emailService").Is(emailService).Ctor("smsService").Is(smsService);但我认为你的设计需要一些工作。您的服务知道电子邮件服务和SMS服务之间的区别这一事实违反了Liskov替换原则。比注入2个相同类型的参数更好的方法是使用复合模式。公共类CompositeMessageService:IMessageService{privatereadonlyIMessageServicemessageServices;publicCompositeMessageService(IMessageService[]messageServices){if(messageServices==null)thrownewArgumentNullException("messageServices");{foreach(varmessageServiceinthis.messageServices){messageService.Send(message);}}}然后,您的原始服务只需要接受一个IMessageService实例。它不需要知道它正在处理的IMessageService类型的详细信息。publicSomeService(IMessageServicemessageService)在StructureMap中,您可以轻松注册IMessageService的所有实例,它会自动将它们注入到IMessageService的构造函数参数数组中。this.Scan(scan=>{scan.TheCallingAssembly();scan.AssemblyContainingType();scan.AddAllTypesOf();});或者您可以显式注入实例。this.For().Use().EnumerableOf().Contains(x=>{x.Type();x.Type();});这意味着可以更改您的配置以更改称为第一顺序的服务。在您当前的设计中,这些细节将被硬编码到接受2个参数的服务中。此外,您可以在不更改设计的情况下添加其他消息服务或删除现有消息服务。生成的命名实例是一个可能的解决方案:_.For().Use().Named("emailService");_.For().Use().Named("短信服务");//首先在IOCthis.For().Use();中写下几行这个.For().Use();//然后我们可以直接在我们类的构造函数注入中使用它//我们需要它的地方IEnumerablemessageServices;publicClassNeedsInjection(IEnumerablemessageServices){这个。消息服务=消息服务;foreach(varmessageServiceinthis.messageServices){//根据需要使用这两个对象}}不需要很复杂。只需注册接口的所有实现。这个.For().Use();这个.For().Use();然后,Structuremap会自动将IMessageService接口的所有实现注入到具有该接口的IEnumerable/list/array的任何构造函数中。如下:privateIEnumerator_current;publicSomeClass(IEnumerablefeatures){_current=features.GetEnumerator();}希望对大家有帮助,大家有用,需要多了解C#学习教程。希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢