有几种解决方案的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对这种设计的优点给出了很好的解释。
但是,如果不知道您正在尝试解决的问题,很难说什么才是适合您的正确解决方案。
你为什么要这样做?你有多少个IHandler实现? – Steven
这只是一个示例场景。无论如何,我可以有多个实现。如果我可以将'SpecificHandlerImpl'转换为'IHandler',为什么不通过一个IOC容器来解决呢? – mamuesstack
“为什么不通过IOC容器解决它们呢?”。因为这很容易导致你的代码和设计不明确。没有更具体的,没有人可以真正的建议你解决这个问题的最好方法是什么。所以我建议发布完整的'IHandler'和'ISpecificHandler'定义,描述你有多少其他实现,并展示一些你期望如何使用这个'IHandler'的例子。 – Steven