Есть ли способ разрешить вложенные интерфейсы в DTO в виде бритвы? - PullRequest
1 голос
/ 07 сентября 2011

У нас проблема с механизмом представления Razor, который не разрешает вложенные интерфейсы. Пример кода:

public interface IDto
{
    Guid Id {get;set;}
}

public interface IUserDto: IDto
{
  string Username {get;set;}
}

//The view
@model IUserDto

//pukes on this line
@Html.DisplayFor(u => u.Id)

Должны ли мы использовать конкретные модели на наших видах? Разве Razor View Engine не способен использовать несколько интерфейсов для каждой модели?

1 Ответ

2 голосов
/ 07 сентября 2011

Это было изменение в ASP.NET MVC 3, которое я уже довел до сведения Microsoft (этот сценарий работал на ASP.NET MVC 1 и 2).

Вот их официальный ответ:

Привет, Дарин (и другие),

Это было преднамеренное изменение, которое мы ввели в ASP.NET MVC 3, чтобы был результатом компромисса между лучшей поддержкой унаследованные модели или лучшая поддержка моделей, которые реализуют интерфейсы. В итоге мы предпочли унаследованные модели, которые от наших опыт - более распространенный подход.

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

Спасибо, команда ASP.NET

Теперь к делу

Должны ли мы использовать конкретные модели на наших видах?

Не обязательно. Вы по-прежнему можете использовать интерфейсы в основных видах, но затем иметь шаблоны редактора / отображения с конкретными типами. Во время выполнения, основываясь на фактическом типе модели представления, платформа выберет правильный шаблон, в котором у вас будет конкретный тип, и разрешит свойство Id.

Другая возможность состоит в том, чтобы использовать абстрактные классы вместо интерфейсов (я знаю :-), как правило, Microsoftish)

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