Как вы связываете списки / коллекции на моделях представлений, используя IoC, DI и MVC? - PullRequest
2 голосов
/ 09 февраля 2011

Я работаю с проектом MVC, пытаюсь реализовать IoC и DI. И то и другое довольно ново для меня, поэтому заранее извиняюсь, если я полностью иду по неверному пути или если мой вопрос не сформулирован четко.

Предположим, у меня есть представление, которое должно отображать форму адреса, одним из элементов которого является раскрывающийся список состояний. (Я понимаю, что адрес вне контекста чего-то другого маловероятен, но для простоты примера предположим, что это так.)

Предположим, это моя модель взгляда:

public class AddressList {
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public List<string> States { get; set; }
    public string Zip { get; set; }
}

Кто несет ответственность за заполнение списка штатов?

Должен ли контроллер делать это, добавив в него службу для получения состояний? Если да, то входит ли такая же логика внедрения и заполнения в каждый из моих контроллеров, нуждающихся в заполнении адреса? Или это должно пойти куда-нибудь еще?

К какому слою относится данная модель вида? Если эта модель представления очень специфична для данного представления в моем приложении, не должно ли это также остаться в моем приложении и, следовательно, не использоваться для передачи в службу для заполнения состояний?

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

В настоящее время я работаю с ASP.NET MVC2, Unity и EF4, поэтому любые примеры, использующие их, будут хорошими. Тем не менее, любые примеры, вероятно, направят меня в правильном направлении.

Заранее спасибо.

РЕДАКТИРОВАТЬ: Извините, но я думаю, что я, возможно, только что наткнулся на то, что я ищу - привязка модели:

http://www.dominicpettifer.co.uk/Blog/39/dependency-injection-in-asp-net-mvc-2---part-2--modelbinders-viewmodels

Это то, что мне нужно? Будет ли это работать с Unity (я вижу здесь примеры использования Castle Windsor)?

Ответы [ 3 ]

3 голосов
/ 09 февраля 2011

Как и другие граничные структуры данных приложения, ViewModels лучше всего моделировать как структуры данных с небольшим поведением. Ответственность контроллеров заключается в загрузке данных и заполнении ViewModels .

Таким образом, вы должны внедрить необходимые службы в контроллер и использовать эти службы для заполнения ViewModel.

0 голосов
/ 10 февраля 2011

Кто несет ответственность за заполнение списка состояний?

Как правило, контроллер

Если контроллер делает это, ему ввели службудля получения штатов?Если да, то входит ли такая же логика внедрения и заполнения в каждый из моих контроллеров, нуждающихся в заполнении адреса?Или он должен идти куда-то еще?

Yep Controller.

Служба внедрена в конструктор.Да, каждый контроллер, который нуждается в этом.Если вы обнаружите, что их много, вам следует рассмотреть возможность использования одного StateController с PartialView

0 голосов
/ 09 февраля 2011

То, что вам нужно, не должно быть таким сложным, как ваше объяснение.Для начала в вашей модели вам не нужно будет указывать список состояний.Таким образом, в вашей модели вы должны иметь

public String State { get; set; }

Тогда, по вашему мнению - при условии, что у вас есть строго типизированное представление в AddressList, у вас есть следующее для состояния

<div class="editor-label">
    <%: Html.Label("State") %>
    </div>
        <div class="editor-field">
            <%= Html.DropDownList(
                "State",          
                 new SelectList(Html.StateDropDownList(HttpContext.Current), "State",  
                 "State",  Model.State != null ? Model.State : null), 
                 new { id = "State", width = "80px" })
            %>
         </div>
     <div>
<div>

Обратите внимание на моеметод расширения StateDropDownList, который можно реализовать следующим образом;вот где может быть вещь Ioc / DI:

public static IEnumerable<State> StateDropDownList(this HtmlHelper htmlHelper, HttpContextBase current)
{
    var stateList = current.Application.Get(Constants.General.StateNames) as IEnumerable<State>;

    if (stateList == null)
    {
        var stateService = ((IIocContainer)current.Application["container"]).Resolve<IStateService>();
        stateList = stateService.GetStates();
        current.Application.Set(Constants.General.StateNames, stateList);
    }

    return stateList;
}

Примечание: IIocContainer можно заменить на конкретный тип или тип интерфейса для используемого Ioc.Кроме того, я не использовал StateID, потому что вы на самом деле использовали значение State (строку) в своей модели AddressList, однако я считаю, что использование StateID может быть лучше, и раскрывающийся список изменится на:

<div class="editor-label">
    <%: Html.Label("State Name") %>
    </div>
        <div class="editor-field">
            <%= Html.DropDownList(
                "StateID",          
                 new SelectList(Html.StateDropDownList(HttpContext.Current), "StateID",  
                 "State",  Model.StateID != null ? Model.StateID : null), 
                 new { id = "StateID", width = "80px" })
            %>
         </div>
     <div>
<div>

Я полагаю, что большинство ваших вопросов, должно быть, ответили на вышеприведенные вопросы, но если нет, позвольте мне сейчас ответить на следующие вопросы:

«Кто несет ответственность за заполнение списка состояний? Должен ли контроллер делать это?если в него была вставлена ​​служба для получения состояний? Если да, то входит ли эта же логика внедрения и заполнения в каждый из моих контроллеров, которым нужно заполнить адрес? Или это должно идти куда-то еще? "

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

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