代码之家  ›  专栏  ›  技术社区  ›  Darren Lewis

在单个ASP.NET MVC项目中实现多个IUnitOfWork

  •  1
  • Darren Lewis  · 技术社区  · 14 年前

    我们有一个网站使用Unity和IUnitOfWork作为我们的EF上下文。到目前为止,我们只使用了一个EF上下文,所以这是在Unity config中映射的。这一切都是通过构造函数注入来处理的,为了保持一致性,我们希望对其进行维护。

    我们现在为我们的 PaymentController

    我知道我可以创造一个新的 <register/> 新上下文的元素,具有一个不同的name属性,但如何在控制器构造函数中实现该属性以使用命名的payments?

      <register type="IUnitOfWork" mapTo="FirstContext" />
      <register type="IUnitOfWork" mapTo="PaymentsContext" name="payments"/>
    
      public class PaymentController()
      {
        public PaymentController(IUnitOfWork unitOfWork) 
        {
            //How to I tell unity that this needs to be a payments
            _unitOfWork = unitOfWork;
        }
      }
    

    1 回复  |  直到 14 年前
        1
  •  0
  •   Steven    14 年前

    FirstContext PaymentsContext 让每个实体都有一组唯一的实体(例如,每个实体都连接到不同的数据库),在代码中显式地定义它是值得的。一种方法是为每个工作单元指定一个工厂:

    public interface IFirstContextFactory
    {
        IUnitOfWork CreateNew();
    }
    
    public interface IPaymentContextFactory
    {
        IUnitOfWork CreateNew();
    }
    
    public class PaymentController()
    {
       public PaymentController(PaymentContextFactory paymentContextFactory)
       {
          //How to I tell unity that this needs to be a payments
          this.paymentContextFactory = paymentContextFactory;
       }
    
       public void DoSomething()
       {
          using (var context = this.paymentContextFactory.CreateNew())
          {
             // Do something useful
    
              context.Commit();
          }
       }
    }
    

    这不仅使您的依赖关系非常清楚(因为您知道代码处理的是什么类型的上下文),而且还简化了DI配置,因为您不需要任何命名注册。