代码之家  ›  专栏  ›  技术社区  ›  Brian J. Hakim

如何实例化unitofwork

  •  0
  • Brian J. Hakim  · 技术社区  · 15 年前

    当我只使用一个类型映射时,一切正常

    unityContainer.RegisterType<IUnitOfWork, UnitOfWork>(); 
    

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

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

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

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

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

    P、 是的,我知道命名容器)

    1 回复  |  直到 15 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

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

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

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

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

    另一个选择是用一些接口(例如IUnitOfWork2)装饰另一个UnitOfWork类。然后将UnitOfWork2注册到IUnitOfWork2,并在需要时通过新接口解析实例。

    尽管你提到你不想重构ServiceLocator.GetInstance-方法。我仍然认为最简单的方法是添加 并使用命名实例。如果这是不可能的,您可以注册一个工厂类到IUnitOfWork并使用它来获得正确的UnitOfWork实现。这是一个 short guide 关于如何与联合注册工厂。请注意,最新版本的Unity可能有不同的方法来实现这一点。也, here's a question 从堆栈溢出处理统一容器和工厂。