0

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

unityContainer.RegisterType<IUnitOfWork, UnitOfWork>(); 

当我使用两种类型映射为同一界面中出现的问题:

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

我已经很常见代码制作像

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

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

如何解决此问题而不重构通用部分?

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

回答

1

您可以使用命名实例,而不是命名容器。您可以命名实例使用Unity这样的注册:然后

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

,解决了正确的实例,可以使用下面的语法:

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

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

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

+0

感谢您的咨询。但看起来问题更为复杂。 – 2010-08-31 15:41:01

+0

你可以扩展你的问题吗?也许我们可以找到另一种解决方案。 – 2010-09-01 04:15:56