首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实例化工作单元

如何实例化工作单元
EN

Stack Overflow用户
提问于 2010-08-31 16:30:37
回答 1查看 324关注 0票数 0

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

代码语言:javascript
复制
unityContainer.RegisterType<IUnitOfWork, UnitOfWork>(); 

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

代码语言:javascript
复制
unityContainer.RegisterType<IUnitOfWork, UnitOfWork1>(); 
unityContainer.RegisterType<IUnitOfWork, UnitOfWork2>(); 

我有一些非常常见的代码,比如

代码语言:javascript
复制
var unitOfWork = ServiceLocator.GetInstance<IUnitOfWork>(); 

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

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

附注:是的,我知道命名容器)

EN

回答 1

Stack Overflow用户

发布于 2010-08-31 16:44:12

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

代码语言:javascript
复制
unityContainer.RegisterType<IUnitOfWork, UnitOfWork1>("MyUnit1");
unityContainer.RegisterType<IUnitOfWork, UnitOfWork2>("MyUnit2");

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

代码语言:javascript
复制
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容器和工厂。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3607315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档