Несколько реализаций IUnitOfWork в одном проекте ASP.NET MVC - PullRequest
1 голос
/ 12 ноября 2010

У нас есть сайт, использующий Unity и IUnitOfWork для нашего контекста EF.До сих пор мы использовали только один EF Context, поэтому он отображен в конфигурации Unity.Все это было обработано посредством внедрения в конструктор, и это то, что мы хотели бы сохранить для согласованности.

Мы ввели еще один EF Context для нашего PaymentController, который используется на сайте, но в настоящее время конфигурация UnityПозволяет нам только создать один тип для IUnitOfWork.

Я знаю, что могу создать новый элемент <register/> для нового контекста с отдельным атрибутом имени, но как мне реализовать это в конструкторе контроллера, чтобы использоватьодин назвал платежи?

  <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 Ответ

0 голосов
/ 12 ноября 2010

Когда 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, потому что вам не понадобятся никакие именованные регистрации.

...