Как правильно заполнить модель для UserControl? - PullRequest
3 голосов
/ 02 июня 2011

Вопрос не о MVC, а об архитектуре кода.

У меня есть частичное представление, которое принимает CompanyModel

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CompanyModel>" %>

<%: Html.TextAreaFor(m => m.Name) %>
<%: Html.TextAreaFor(m => m.Location) %>

CompanyModel

public class CompanyModel
{
     [LocalizedDisplayName("Name", NameResourceType = typeof(Resources.Views.CompanyBackground))]
     public string Name{get;set;}
     [LocalizedDisplayName("Location", NameResourceType = typeof(Resources.Views.CompanyBackground))]
     public string Location{get;set;}

     public CompanyModel()
     {
          var info = Project.GetCompanyInfo();
     }
}

Project.GetCompanyInfo() является уровнем DAL и получает данные из БД с использованием Entity Framework

Мой вопрос: что такое «хороший» и правильный способ заполнения CompanyModel?:

Решение 1

Создать CompanyBag

public class CompanyBag
{
     public string Name{get;set;}
     public string Location{get;set;}
}

и Project.GetCompanyInfo() вернет CompanyBag и в .ctorиз CompanyModel Я заполню модель.

Решение 2

Project.GetCompanyInfo() вернет CompanyModel (и, следовательно, класс помощника не требуется), и яЗаполните Model в .ctor CompanyModel

Решение 3

Может быть, ваше решение?

ОБНОВЛЕНИЕ: У меня есть LoadController с действием Load, и это действие является своего рода Фабрикой.Он возьмет список представлений и создаст их по отражению, а затем загрузит на страницу по Html.RenderPartial(viewName, viewModel).Итак, CompanyModel - это только один пример представлений, и поэтому мне нужно, чтобы каждое представление было независимым.

Итак, мой вопрос: должен ли GetCompanyInfo вернуть CompanyBag или CompanyModel, и я заполню модель в .ctor?

Спасибо

Ответы [ 2 ]

2 голосов
/ 02 июня 2011

Хорошо, после обновления вопроса вот мой обновленный ответ:)

Я предполагаю, что различные заполненные представления LoadController принимают разные типы ViewModel, и каждый ViewModel заполняется издругая часть модели предметной области.Вот как я бы занялся этим:

Во-первых, создайте каждый частичный вид как строго типизированный подкласс ViewUserControl<TViewModel>, чтобы LoadController мог выяснить, какой тип ViewModel ему нужен для каждого из представлений.сказано создать.

Во-вторых, определите интерфейс IViewModelFactory<TViewModel> и создайте одну реализацию для каждого типа ViewModel, который вам требуется;каждая реализация будет знать, как создать и заполнить свой тип ViewModel из вашей доменной модели.

Наконец, LoadController определит тип ViewModel, необходимый для каждого представления, которое ему предлагается создать,и используйте соответствующий IViewModelFactory для его создания.

Чтобы избежать ненужных накладных расходов, LoadController может найти все доступные IViewModelFactory реализации во время выполнения и сохранить их в статическом хранилище.против типа ViewModel, который они создают.

Итак, чтобы подвести итог: я бы заполнил CompanyViewModel из Company, используя CompanyViewModelFactory, я бы заполнил UserViewModel из Userиспользуя UserViewModelFactory и т. д.:)

0 голосов
/ 03 июня 2011

Почему бы не использовать Расширенные Объекты Запроса, чтобы доставить вашу ViewModel прямо к вам без необходимости сначала получать график Full Entity?

http://www.yellowfeather.co.uk/2011/03/enhanced-query-objects-with-sharp-architecture/

Я понимаю, что Крис написал это для NHibernate, но этого должно быть более чем достаточно, чтобы дать вам представление о том, что вы могли бы сделать.

Кроме этого, я не могу предложить ничего, кроме того, что Стив уже сказал. Пожалуйста, обратите пристальное внимание на его # 2. Не могу не подчеркнуть это достаточно.

...