Dependency injection 如何实例化unitofwork

Dependency injection 如何实例化unitofwork,dependency-injection,unity-container,enterprise-library,Dependency Injection,Unity Container,Enterprise Library,我正在使用依赖注入模式来解析UnitOfWork的正确实例。 当我只使用一个类型映射时,一切正常 unityContainer.RegisterType<IUnitOfWork, UnitOfWork>(); unityContainer.RegisterType(); 当我对同一接口使用两个类型映射时,会出现问题: unityContainer.RegisterType<IUnitOfWork, UnitOfWork1>(); unityContainer.Re

我正在使用依赖注入模式来解析UnitOfWork的正确实例。 当我只使用一个类型映射时,一切正常

unityContainer.RegisterType<IUnitOfWork, UnitOfWork>(); 
unityContainer.RegisterType();
当我对同一接口使用两个类型映射时,会出现问题:

unityContainer.RegisterType<IUnitOfWork, UnitOfWork1>(); 
unityContainer.RegisterType<IUnitOfWork, UnitOfWork2>(); 
unityContainer.RegisterType();
unityContainer.RegisterType();
我有一个非常常见的代码,比如

var unitOfWork = ServiceLocator.GetInstance<IUnitOfWork>(); 
var unitOfWork=ServiceLocator.GetInstance();
在某些情况下,它应该返回UnitOfWork,在某些情况下,它应该返回UnitOfWork2

我如何在不重构公共部分的情况下解决这个问题


还有,是的-我知道命名容器)

您可以使用命名实例而不是命名容器。您可以使用Unity注册命名实例,如下所示:

unityContainer.RegisterType<IUnitOfWork, UnitOfWork1>("MyUnit1");
unityContainer.RegisterType<IUnitOfWork, UnitOfWork2>("MyUnit2");
unityContainer.RegisterType(“MyUnit1”);
unityContainer.RegisterType(“MyUnit2”);
然后,要解析正确的实例,可以使用以下语法:

var unitOfWork = ServiceLocator.GetInstance<IUnitOfWork>("MyUnit2"); 
var unitOfWork=ServiceLocator.GetInstance(“MyUnit2”);
另一个选项是用一些接口(例如IUnitOfWork2)装饰另一个UnitOfWork类。然后将UnitOfWork2注册到IUnitOfWork2,并在需要时通过该新接口解析实例


尽管您提到不想重构ServiceLocator.GetInstance-method。我仍然认为最简单的方法是向GetInstance方法添加一个可选参数,并使用命名实例。如果这是不可能的,那么您可以将工厂类注册到IUnitOfWork,并使用它来获得正确的UnitOfWork实现。下面是一个关于如何向Unity注册工厂的示例。请注意,最新版本的Unity可能有不同的实现方式。另外,还有处理Unity容器和工厂的堆栈溢出。

谢谢您的建议。但问题似乎更为复杂。你能进一步说明你的问题吗?也许我们可以找到另一个解决办法。