Я создаю свое первое приложение MVC. Я знаю, что не должен запрашивать данные в конструкторе ViewModel из-за разделения интересов, и в настоящее время я выполняю рефакторинг приложения для исправления ViewModels (я передавал им dbContext). В то же время я хочу избежать повторения. У меня есть ViewModels, которые используются в других ViewModels и действиях контроллера.
Как мне этого добиться?
В этой модели представления использовался конструктор, который запрашивал базу данных с использованием DbContext и присваивал извлеченные списки свойствам:
BusinessClientRelationshipsViewModel.cs
public class BusinessClientRelationshipsViewModel
{
public int BusinessId { get; set; }
public IEnumerable<SelectListItem> Clients { get; set; }
public IEnumerable<SelectListItem> Businesses { get; set; }
public IEnumerable<SelectListItem> Relationships { get; set; }
public IEnumerable<RelatedClientsListViewModel> RelatedClientsList { get; set; }
}
Я избавился от DbContext и ввел шаблон репозитория / единицы работы. Я также удалил конструктор из ViewModel. В моем контроллере я инициализирую ViewModel так:
BusinessClientRelationships.cs
public ActionResult List(int id)
{
var viewModel = new BusinessClientRelationshipsViewModel()
{
BusinessId = id,
RelatedClientsList = _unitOfWork.ClientBusinessRelationships.GetRelatedClientsList(id),
Clients = _unitOfWork.Clients.GetSelectListItems(),
Businesses = _unitOfWork.Businesses.GetSelectListItems(),
Relationships = _unitOfWork.Relationships.GetSelectListItems()
};
return View("_BusinessClientRelationships", viewModel);
}
Однако у меня также есть другие ViewModel (для родительских представлений), использующие ViewModel выше (для частичного представления). Моя проблема в том, что я не знаю, как правильно инициализировать BusinessClientRelationshipsViewModel (без повторения каждый раз, когда я делаю это):
BusinessDetailsViewModel.cs
public class BusinessDetailsViewModel
{
public Business Business { get; set; }
public BusinessClientRelationshipsViewModel BusinessClientRelationshipsViewModel { get; set; }
public BusinessAddressChangesViewModel BusinessAddressChangesViewModel { get; set; }
}