它是一個公認的做法,使視圖依賴於模型的數據訪問層
在對於一些人來說,也許,沒有我。
或者我應該簡單地創建一個ViewModel來從視圖中提取細節?
這就是我會做的。
當然,如果你不想按照我的建議使用視圖模型,你有幾種可能性。因此,讓我們假設您有以下域模型:
public class MyDomainModel
{
public string Foo { get; set; }
}
但您想要將某些元數據與它關聯。
你有和第一種可能性是內置是使用[MetadataType]
屬性:
[MetadataType(typeof(MyDomainModelMetadata))]
public class MyDomainModel
{
public string Foo { get; set; }
}
,並有一個單獨的類中的元數據:
public class MyDomainModelMetadata
{
[Display(Name = "foo bar")]
public object Foo { get; set; }
}
但仍您的DAL必須知道不太好的元數據和表示邏輯。 MyDomainModelMetadata
類必須在您的DAL中定義,因爲屬性表示編譯時烘焙到程序集中的元數據。
這給我們帶來包括編寫自定義模型元數據提供的第二種可能:
public class MyMetadataProvider : DataAnnotationsModelMetadataProvider
{
protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
{
// TODO: you could keep a static hashtable that will map between your
// domain model type and the associated metadata type in your UI layer
// but for the purpose of this demonstration I have hardcoded them to simplify
if (containerType == typeof(MyDomainModel))
{
return GetMetadataForProperty(
modelAccessor,
typeof(MyDomainModelMetadata),
propertyName
);
}
return base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
}
}
將在您的Application_Start
登記,將取代默認的元數據提供:
ModelMetadataProviders.Current = new MyMetadataProvider();
現在,您可以擺脫域模型中的MetadataType
屬性,並在您的UI層(MVC應用程序本身)中擁有MyDomainModelMetadata
類。
感謝Darin的澄清。 – 2012-03-26 09:38:39
非常感謝您的回答。非常有趣,非常感謝。 – 2012-03-27 07:01:21