【问题标题】:How to instantiate unitofwork如何实例化工作单元
【发布时间】:2010-08-31 08:30:37
【问题描述】:

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

unityContainer.RegisterType<IUnitOfWork, UnitOfWork>(); 

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案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 实现。这是一个short guide,关于如何在 Unity 中注册工厂。请注意,最新版本的 Unity 可能有不同的执行方式。另外,来自 Stack Overflow 的 here's a question 处理 Unity 容器和工厂。

    【讨论】:

    • 感谢您的建议。但问题比看起来要复杂得多。
    • 您能详细说明您的问题吗?也许我们可以找到另一种解决方案。
    猜你喜欢
    • 2018-02-11
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多