我使用依赖注入模式来解析我的UnitOfWork的正确实例。当我只使用一种类型映射时,一切都是正常的
unityContainer.RegisterType<IUnitOfWork, UnitOfWork>(); 当我对同一个接口使用两个类型映射时,就会出现这个问题:
unityContainer.RegisterType<IUnitOfWork, UnitOfWork1>();
unityContainer.RegisterType<IUnitOfWork, UnitOfWork2>(); 我有一些非常常见的代码,比如
var unitOfWork = ServiceLocator.GetInstance<IUnitOfWork>(); 在某些情况下,它应该返回UnitOfWork,在某些情况下,它应该返回UnitOfWork2。
我如何在不重构公共部分的情况下解决这个问题?
附注:是的,我知道命名容器)
发布于 2010-08-31 16:44:12
您可以使用命名实例而不是命名容器。您可以使用Unity注册命名实例,如下所示:
unityContainer.RegisterType<IUnitOfWork, UnitOfWork1>("MyUnit1");
unityContainer.RegisterType<IUnitOfWork, UnitOfWork2>("MyUnit2");然后,要解析正确的实例,可以使用以下语法:
var unitOfWork = ServiceLocator.GetInstance<IUnitOfWork>("MyUnit2"); 另一种选择是用一些接口(例如IUnitOfWork2)来装饰你的另一个UnitOfWork类。然后向IUnitOfWork2注册UnitOfWork2,并在需要时通过新接口解析实例。
尽管您提到不想重构ServiceLocator.GetInstance-method。我仍然认为最简单的方法是将可选参数添加到GetInstance-method中,并使用命名实例。如果这是不成问题的,您也许可以向IUnitOfWork注册一个工厂类,并使用它来获得正确的UnitOfWork实现。这是一个关于如何向Unity注册工厂的short guide。请注意,Unity的最新版本可能有不同的方式。此外,来自Stack Overflow的here's a question处理Unity容器和工厂。
https://stackoverflow.com/questions/3607315
复制相似问题