ASP.NET MVC 2 - Как использовать интерфейс в качестве типа для строго типизированного представления - PullRequest
1 голос
/ 25 марта 2010

Я бы хотел отделить свои конкретные классы от моих взглядов. Без использования строго типизированных представлений, я в порядке. Я просто использую большой список параметров в сигнатурах метода контроллера, а затем использую методы фабрики моего сервисного уровня для создания моих конкретных объектов.

Это на самом деле просто прекрасно, но заставило меня задуматься, и после небольшой игры я понял, что для метода контроллера буквально невозможно принять интерфейс в качестве параметра метода - потому что у него нет способа его создания. Также нельзя создать строго типизированное представление с использованием интерфейса через IDE (что на самом деле имеет смысл).

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

Я хочу конвертировать из:

[Authorize]
[AcceptVerbs(HttpVerbs.Post)]
[UrlRoute(Path = "Application/Edit/{id}")]
public ActionResult Edit(String id, String TypeCode, String TimeCode, String[] SelectedSchoolSystems,
            String PositionChoice1, String PositionChoice2, String PositionChoice3, String Reason, String LocationPreference,
            String AvailableDate, String RecipientsNotSelected, String RecipientsSelected) {

    //New blank app
    IApplication _application = ApplicationService.GetById(id);

к чему-то вроде

[Authorize]
[AcceptVerbs(HttpVerbs.Post)]
[UrlRoute(Path = "Application/Edit/{id}")]
public ActionResult Edit(String id, IApplication app) {

            //Don't need to do this anymore
            //IApplication _application = ApplicationService.GetById(id);

Ответы [ 3 ]

2 голосов
/ 25 марта 2010

Вам нужен вид модели слоя.

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

И попытка связать сущности из формы без доступа к базе данных также создаст много проблем.

1 голос
/ 25 марта 2010

Вы можете написать пользовательский механизм связывания модели, который будет создавать правильный тип:

public class MyModelBinder: DefaultModelBinder
{
    protected override object CreateModel(
        ControllerContext controllerContext, 
        ModelBindingContext bindingContext, 
        Type modelType
    )
    {
        return // ... instantiate your model here
    }
}

А потом:

public ActionResult Edit(
    string id, 
    [ModelBinder(typeof(MyModelBinder))] IApplication app
)
{
   ...
}
1 голос
/ 25 марта 2010

Пользовательская модель привязки. Просто попросите механизм связывания построить экземпляр производного класса и вернуть его в качестве интерфейса.

С другой стороны, почему? Как правило, вы используете модели для конкретного вида как для вида, так и для параметров контроллера. Каждое представление / действие имеет специфические потребности модели. Я могу понять, почему вы хотите получить их из общего интерфейса или абстрактного класса - например, ваша главная страница содержит набор общей информации, которую она может использовать, но зачем конкретному действию когда-либо понадобится получать данные как абстракция? Разве он не знает точно, какие данные ему нужны, и просто использует правильный производный класс в качестве типа параметра?

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