После работы с большим приложением ASP.NET MVC я обнаружил, что наиболее продуктивный подход при минимизации приведения во время выполнения основан на использовании обобщенных элементов для имитации вложенной структуры представлений. По сути, представления получают свой собственный тип данных. Обычно это либо доменные объекты, либо коллекции доменных объектов, которые содержат метаданные. Универсальные версии этих типов доступны на всех возможных главных страницах, принимая параметр типа, который определяет данные, относящиеся к главной странице.
public class Car {
// can be used as a model
}
public class CarCollection: Collection<Car> {
public BodyTypes BodyType {get;set;}
public Colors Color {get;set;}
// can also be used as a model
}
public interface ILayoutModel<TLayout> {
TLayout LayoutModel {get;set;}
}
public class CarView<TLayout>: Car, ILayoutModel<TLayout> {
// model that can be used with strongly-typed master page
}
public class CarCollection<TLayout> : CarCollection, ILayoutModel<TLayout> {
// model that can be used with strongly-typed master page
}
public class LayoutAData {
// model for LayoutA.master
}
public class LayoutBData {
// model for LayoutB.master
}
Также возможно инвертировать универсальность, но, поскольку, по моему мнению, данные определяют макет, данные представления должны доминировать над данными макета. LayoutA.master будет производным от ViewMasterPage<ILayoutModel<LayoutAData>>
, а LayoutB.master будет производным от ViewMasterPage<ILayoutModel<LayoutBData>>
. Благодаря этому данные представления и данные макета разделяются согласованным, строго типизированным и гибким способом.