Как работать с MVC ViewModel - Доменная модель - Объект в контроллерах и сервисах MVC
Мы пишем приложение для обслуживания данных MVC, которое является частью более крупного проекта. Мы стараемся использовать доменный дизайн DDD. Есть уже другие вопросы по этому поводу на SO, как здесь, здесь и здесь. И все же они не полностью отвечают на мой вопрос.
У нас также есть ограниченные контексты на уровне данных, так как база данных имеет 755 таблиц. Таким образом, мы создали ограниченный контекст для бизнеса, ролей, продуктов, клиентов и т. Д.
Проблема, которую мы имеем, состоит в том, что в приложении MVC у нас есть представление для "начальной установки", которая использует ViewModel, которая в конечном итоге охватывает несколько ограниченных контекстов (используя шаблон IUnitOfWork в Entity Framework 6). Следовательно, это представление должно соответствовать бизнес-контексту и контексту ролей.
Модель предметной области будет иметь Business
модель и Address
модель и несколько других моделей в большем графе pbject.
ViewModel - это упрощенная, упрощенная модель этих двух и других моделей предметной области:
public class InitialSetupViewModel
{
string BusinessName{get;set;}
string Street{get;set;}
string Street2{get;set;}
string State{get;set;}
string ZIP{get;set;}
...
}
Эта ViewModel должна соответствовать моделям домена, что мы делаем с Automapper.
Контроллер получает сервис домена, введенный:
public class SetupController : Controller
{
private readonly IMaintenanceService service;
public SetupController( IMaintenanceService maintenanceService = null )
{
service = maintenanceService;
}
public void Create(...????....)
{
service.CreateBusiness(..?.);
}
}
Проблемы:
Служба не может знать о
InitialSetupViewModel
так что же нужно передавать в сервис?Служба должна знать о
BusinessDbContext
а такжеRolesDbContext
, Поэтому я должен вызвать SaveChanges() для обоих, что превосходит цель иметь один IUnitOfWork. Нужно ли создавать еще один UnitOfWork, который включает в себя как бизнес, так и роли?
Я не думаю, что было бы оправданно объединять эти два IUnitOfWorks в один только для того, чтобы заставить это представление MVC работать. Но каково решение?
Спасибо!
1 ответ
Всегда трудно иметь твердое мнение о домене, который вы не знаете, но здесь это так:
Как уже было отмечено,
Controller
должен взять на себя ответственность за сопоставление между моделью представления и предметной области, DTO или чем-то еще. Это может взять примерInitialSetupViewModel
в качестве входных данных, но детали реализации могут отличаться.Это правда, что ремоделирование домена может быть правильным выбором, если вам нужно иначе нарушить границы вашего ограниченного контекста. Сосредоточив внимание только на модели "Единица работы", я не совсем понимаю ваши сомнения.
Внедрение Unit of Work является обязанностью отслеживать все доменные объекты, которые должны быть синхронизированы в рамках одной транзакции. Нет ничего странного в том, что одни и те же доменные объекты участвуют в нескольких разных единицах работы. Это не означает, что вы должны объединять "меньшие" реализации Единицы работы в "более крупные", когда вы имеете дело с другим типом агрегата, но обязательно включаете и "роли", и "бизнесы" в одну Единицу работы.
Это не должно увлекаться тем, как выглядит ваше представление, но тем, что является "истинным" в ваших моделях доменов, и вместо того, чтобы иметь дело только с коллекциями объектов домена, ваш домен, вероятно, должен описывать подходящие агрегаты.
Может быть, даже нормально хранить каждый объект домена с отдельными транзакциями (единицами работы), то есть если их синхронизация не требуется - например, все еще хорошо, если (или, возможно, даже желательно) не удается сохранить Business
не останавливается Roles
от прохождения или наоборот. На самом деле, я думаю, можно даже утверждать, что, если ограниченные контексты на самом деле правильно определены, это должно быть так.
Я надеюсь, что эти комментарии помогут.
Мартин Фаулер о единице труда и агрегатах.