Проектирование сервисного уровня и репозиториев в Microsoft MVC - PullRequest
2 голосов
/ 20 мая 2011

У меня есть следующая проблема - или, скорее, срочная потребность в ценном совете - с Microsoft MVC. Определенное действие от клиента приводит к созданию:

  • Примечание в таблице Примечания
  • Запись в таблице для HourRegistrations
  • Запись в журнале изменений для билетов

Я использую сервисный уровень для бизнес-действий и репозитории для CRUD-действий. Проблема в том, что мне иногда нужно соединять объекты из разных DataContexts, поэтому я предполагаю, что я использую некорректный дизайн. Недавно мы начали удалять всю бизнес-логику из наших контроллеров и репозиториев, и это одна из первых вещей, с которыми я сталкиваюсь.

Пример:

BLogic.AddRemarks(Ticket t, ...)
{
  Remark r = _remarksRepository.Create();
  r.Ticket = t;
  _remarksRepository.Add(r);
  _remarksRepository.Save();
}

Это запускает kBOOM, так как Ticket выбирается в контроллере с использованием репозитория. Поэтому Remark r и Ticket t не используют один и тот же контекст данных.

Я могу изменить сигнатуру метода и предоставить int TicketId, но это не так. Кроме того, у меня возникают похожие проблемы в дальнейшем.

Мои репозитории создаются в конструкторе класса обслуживания. Возможно, я должен создать их в начале метода? Даже тогда я должен часто передавать идентификаторы вместо реальных объектов.

1 Ответ

3 голосов
/ 20 мая 2011

Я предлагаю использовать инъекцию зависимостей (или инверсию управления - зависит от того, как бы вы хотели это назвать).Я использую себя замок Виндор.Действительно просто интегрировать с mvc.net. читать дальше

Когда IoC запущен и работает, создайте ContextManager.Примерно так:

public class ContextManager : IContextManager
{
    private XContext context;

    public XContext GetContext()
    {
        return context ?? (context = XContext.Create());
    }
}

Установите IContextManager lifestyle как perwebrequest, и вы получите себе контекст, к которому вы можете получить доступ из репозиториев и сервисов.и это то же самое для одного запроса.

EDIT

Вы также должны создать свой собственный controllerFactory

, тогда вы можете использовать свои сервисы и репозитории, как это:

public class MyController : Controller
{
    public ISomeService SomeService { get; set; }
    public IContextManager ContextManager { get; set; }

...

}

Вам не нужно создавать новые экземпляры для сервисов и репозиториев, и вы можете управлять этими объектами из конфигурации.Наиболее разумным будет синглтон

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...