2016-04-28 58 views
0

我从另外一个如何解决基本接口的实例与简单的注射器

public interface ISpecificHandler : IHandler 

继承了简单的喷油器注册我的类型和实现

container.RegisterSingleton<ISpecificHandler, SpecificHandlerImpl>(); 

但我怎么能只是一个接口解决IHandler而不是ISpecificHandler

//Expect SpecificHandlerImpl as handler 
IHandler handler = ServiceLocator.GetInstance<IHandler>(); //error 

这引发了IHandler类型未注册

+0

你为什么要这样做?你有多少个IHandler实现? – Steven

+0

这只是一个示例场景。无论如何,我可以有多个实现。如果我可以将'SpecificHandlerImpl'转换为'IHandler',为什么不通过一个IOC容器来解决呢? – mamuesstack

+0

“为什么不通过IOC容器解决它们呢?”。因为这很容易导致你的代码和设计不明确。没有更具体的,没有人可以真正的建议你解决这个问题的最好方法是什么。所以我建议发布完整的'IHandler'和'ISpecificHandler'定义,描述你有多少其他实现,并展示一些你期望如何使用这个'IHandler'的例子。 – Steven

回答

3

有几种解决方案的InvalidOperationException,但它确实取决于你的应用程序的真正需求。这里有一些建议。

你刚才注册的实施两次:

container.Register<IHandler, SpecificHandlerImpl>(Lifestyle.Scoped); 
container.Register<ISpecificHandler, SpecificHandlerImpl>(Lifestyle.Scoped); 

但是,也许你想解决多个处理程序,在这种情况下,你将有可能将其注册为一个集合:

var reg1 = Lifestyle.Singleton.CreateRegistration<SpecificHandlerImpl>(); 
var reg2 = Lifestyle.Singleton.CreateRegistration<AnotherHandlerImpl>(); 

container.RegisterCollection<IHandler>(new[] { reg1, reg2 }); 

你可能但在使用非通用接口时遇到麻烦,因为通常会有一个特定实现应该在特定情况下执行(换句话说,您可能违反了Liskov Substitution Principle)。所以你通常会更好地使用通用的IHandler<T>抽象,其中T是一个包含处理程序值的参数对象。在这种情况下,在关闭的IHandler<T>与实现之间始终存在一对一映射。 This article对这种设计的优点给出了很好的解释。

但是,如果不知道您正在尝试解决的问题,很难说什么才是适合您的正确解决方案。

+0

谢谢Steven,现在我是IOC容器和SimpleInjector的新手。提供的代码只是试用项目的一部分,以了解SimpleInjector细节。但是现在我意识到这种行为不是特定于实现的,而是为了防止不确定性 – mamuesstack

相关问题