如何实例化单元工作

时间:2010-08-31 08:30:37

标签: dependency-injection unity-container enterprise-library

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

unityContainer.RegisterType<IUnitOfWork, UnitOfWork>(); 

当我对同一个接口使用两个类型映射时会出现问题:

unityContainer.RegisterType<IUnitOfWork, UnitOfWork1>(); 
unityContainer.RegisterType<IUnitOfWork, UnitOfWork2>(); 

我有非常常见的代码,可以像

那样进行调用
var unitOfWork = ServiceLocator.GetInstance<IUnitOfWork>(); 

在某些情况下,它应该返回UnitOfWork,在某些情况下它应该返回UnitOfWork2。

如何在不重构公共部分的情况下解决此问题?

P.S。是的 - 我知道命名的容器))

1 个答案:

答案 0 :(得分:1)

您可以使用命名实例而不是命名容器。您可以使用Unity注册命名实例:

unityContainer.RegisterType<IUnitOfWork, UnitOfWork1>("MyUnit1");
unityContainer.RegisterType<IUnitOfWork, UnitOfWork2>("MyUnit2");

然后,要解析正确的实例,可以使用以下语法:

var unitOfWork = ServiceLocator.GetInstance<IUnitOfWork>("MyUnit2"); 

另一种选择是用一些接口(例如IUnitOfWork2)装饰你的另一个UnitOfWork类。然后将UnitOfWork2注册到IUnitOfWork2,并在需要时通过该新接口解析实例。

虽然您提到您不想重构ServiceLocator.GetInstance方法。我仍然认为最简单的方法是在GetInstance方法中添加可选参数并使用命名实例。如果这是不可能的,您可以将工厂类注册到IUnitOfWork并使用它来获得正确的UnitOfWork实现。这是关于如何使用Unity注册工厂的short guide。请注意,最新版本的Unity可能有不同的方法。另外,来自Stack Overflow的here's a question处理Unity容器和工厂。