Как это часто бывает с шаблонами, это действительно зависит. ViewModel может раскрыть базовую модель, и нет строгого и быстрого правила, которое говорит, что вы «должны» все спрятать и делегировать. Я говорил со многими людьми, которые являются строгими приверженцами LOD, и все же они согласны с тем, что в случае привязки пользовательского интерфейса это не применяется.
Теперь, в случае, если эта модель DTO или нет, вы найдете много разных мнений. Некоторые считают, что единственное, что должно когда-либо быть на клиенте, это чистая проекция, то есть DTO со всей логикой, живущей на сервере, в то время как другие считают, что перемещение сущностей между уровнями - это хорошо. Это было бы обсуждение для другого поста. : -)
Как правило, я бы порекомендовал руководствоваться указанием на наличие виртуальной машины высокого уровня, которую можно использовать для состояния экрана и т. Д.
Что касается дочерних моделей, таких как OrderDetail, то, если дочерней модели достаточно просто связать ее, просто представьте ее напрямую. Теперь следует рассмотреть вопрос об уведомлении: если ваша модель не реализует INPC, у вас может не быть иного выбора, кроме как обернуть его для правильной работы привязки.
Даже если он реализует INPC, могут существовать проблемы, относящиеся к представлению, которые эта модель не содержит, но которые необходимы для функционирования представления. В этом случае я бы использовал простую агрегацию и создал бы OrderDetailVM, который непосредственно предоставляет базовый OrderDetail и добавляет дополнительные свойства.
Например
public class OrderDetailViewModel
{
public OrderDetail OrderDetail {get;set;}
public bool IsValid {get;set;}
}
Где IsValid проверяет некоторую логику, специфичную для экрана.
Это действительно зависит от того, какой степени инкапсуляции вы хотите достичь. Я не нашел бы ничего плохого в использовании модели делегирования. В зависимости от сложности, хотя это может быть громоздким, например, представьте, есть ли у OrderDetail дополнительные дочерние элементы и т. Д.
НТН
Гленн