IoC-支持单一接口的多种实现我想知道为什么.NetIoC容器不能轻易支持单一接口的多种实现!也许我错了,但据我所知,像Ninject这样的框架使用注释部分支持此功能(如何?)。我不认为像Windsor或SimpleInjector这样的其他框架有一个简单的机制来支持这种情况。有什么理由不支持许多框架吗?AFAIK,使用接口的最重要原因之一是实现松散耦合。如果旨在改善松散耦合的框架不能流畅地支持单个接口的多个实现,我不明白为什么!PS当然我理解在运行时会有分辨率问题,容器会迷茫选择哪个实现,但这是设计中必须要考虑的事情,对吧?Unity具有相同的功能Registernameddependenciesvarcontainer=newUnityContainer();container.RegisterType("测试连接器");按名称解析container.Resolve("TestConnector");相同方法[Dependency("TestConnector")]publicIConnectorConnector{get;放;}Windsor是同一个类Program{staticvoidMain(string[]args){varcontainer=newWindsorContainer().Register(Component.For().ImplementedBy().Named("ConnectorA")).Register(Component.For().ImplementedBy().Named("ConnectorB"));varconnectorA=container.Resolve("ConnectorA");Console.WriteLine("连接器类型:{0}",connectorA.GetType());varconnectorB=container.Resolve("ConnectorB");Console.WriteLine("连接器类型:{0}",connectorB.GetType());控制台.ReadKey();}}publicinterfaceIConnector{}publicclassConnectorA:IConnector{}publicclassConnectorB:IConnector{}我建议查看约定优于配置,尤其是基于约定的依赖注入动作和基于上下文的依赖注入大多数IoC(如果不是全部)都支持这两种方法。您可以找到许多有趣的示例,其中包含不同的IoC库,以及当多个实现绑定到一个接口时它的用处。例如,ninject支持绑定一个接口的多个实现:根据上下文或属性、按名称等。根据上下文,以下代码段会根据目标类型自动实现:Bind().To().WhenInjectedInto(typeof(OnLandAttack));Bind().To().WhenInjectedInto(typeof(AmphibiousAttack));在XML或数据库中按名称配置很有用。考虑InNamedScope:Bind().To().Named("Strong");Bind().To().Named("弱");按照惯例,在项目的不同部分使用不同的依赖配置。你的前提是错误的。Windsor愉快地接受同一服务的多个实现的注册。除了GSerjo在Windsor中提到的命名组件解析支持(默认情况下)之外,第一个注册的实现将获胜,但您可以在注册替代实现时使用IsDefault()方法覆盖它。有关详细信息,请参阅http://docs.castleproject.org/Windsor.Registering-components-one-by-one.ashx。如果您希望更好地控制跨多个实现的选择,您可以创建一个IHandlerSelector实现来执行此操作。有关详细信息,请参阅http://stw.castleproject.org/Windsor.Handler-Selectors.ashx。我的容器Griffin.Container支持它。注册商.RegisterConcrete();注册商.RegisterConcrete();并得到:varservices=container.Resolve();但是,您无法获得一种特定的实现。这是一个设计决定。如果您必须获得特定的实现,最好在容器中注册工厂。在最佳实践部分阅读更多内容。Griffin.Container可以在github上找到:https://github.com/jgauffin/griffin.containerStructureMap提供了如下函数:For().Add().Named("MyInterfaceImpl1");For().Add().Ctor().Is(i=>i.GetInstance("MyInterfaceImpl1"));你的问题有点含糊,因为你没有提供具体的例子说明你什么时候需要这个。在大多数情况下,您的应用程序或设计存在问题,或者您没有遵循DI最佳实践。所有容器都允许您使用与IEnumerable相同的接口注册多个依赖的IEnumerable,即使它们没有对多个实例的深度支持。但是,将服务列表注入其他服务是一种设计味道,最好将此列表隐藏在组合后面。这隐藏了抽象背后有多个实现的事实,并允许您通过仅更改应用程序中的一个地方来轻松更改这些实现的使用方式。我不相信任何IoC框架都支持为您生成组合,因为没有默认的方式来处理包装的实现。你必须自己写这个复合材料。但是,由于编写这样的作文其实很简单,所以框架中没有这个功能。如果你想要多个实现但总是需要返回一个,总有一种方法可以根据一些配置来实现。大多数容器允许您在XML配置文件中配置这些依赖项。但即使容器不包含此类功能,也可以手动从配置文件中读取值并向容器注册正确的类型。如果您有一个用于生产的特定接口的实现和另一个用于单元测试的实现,那么您应该只向容器注册生产实现。你的单元测试应该清理任何DI容器,你应该手动创建一个被测试的类并在它的构造函数中注入假的依赖,只是新类型。使用DI容器会污染并使测试复杂化。为此,您需要围绕构造函数注入模式设计此类型。不要在被测服务中调用容器(或容器上的任何其他外观)来检索依赖项。以上是C#学习教程:IoC——多种实现支持单一接口共享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
