我正在使用依赖注入模式来解析我的UnitOfWork的正确实例。 当我只使用一种类型映射时,一切正常
unityContainer.RegisterType<IUnitOfWork, UnitOfWork>();
当我对同一个接口使用两个类型映射时会出现问题:
unityContainer.RegisterType<IUnitOfWork, UnitOfWork1>();
unityContainer.RegisterType<IUnitOfWork, UnitOfWork2>();
我有非常常见的代码,可以像
那样进行调用var unitOfWork = ServiceLocator.GetInstance<IUnitOfWork>();
在某些情况下,它应该返回UnitOfWork,在某些情况下它应该返回UnitOfWork2。
如何在不重构公共部分的情况下解决此问题?
P.S。是的 - 我知道命名的容器))
答案 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容器和工厂。