は、それが受け入れられた練習がない私にとっては、多分何人かの人々のためにデータアクセス層
でモデルのビューに依存することです。
また、単にビューから詳細を抽象化するViewModelを作成する必要はありますか?
これは私がやることです。
もちろん、ビューモデルを使用することの提案に従わない場合は、いくつかの可能性があります。
public class MyDomainModel
{
public string Foo { get; set; }
}
しかし、あなたはそれにいくつかのメタデータを関連付けしたい:それでは、次のドメインモデルを持っていると仮定してみましょう。
[MetadataType(typeof(MyDomainModelMetadata))]
public class MyDomainModel
{
public string Foo { get; set; }
}
とメタデータのために別のクラスを持っている:
public class MyDomainModelMetadata
{
[Display(Name = "foo bar")]
public object Foo { get; set; }
}
しかし、まだあなたが持っていると
第1の可能性は、内蔵[MetadataType]
属性を使用することですあなたのDALはメタデータとプレゼンテーションロジックについてよく知っていなければなりません。属性はコンパイル時にアセンブリに焼き付けられるメタデータを表すため、MyDomainModelMetadata
クラスはDALで定義する必要があります。
ModelMetadataProviders.Current = new MyMetadataProvider();
:
あなた
Application_Start
に登録され、
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);
}
}
は、デフォルトのメタデータプロバイダに置き換えられます:カスタムモデルのメタデータプロバイダを書くからなる第二の可能性に私たちをもたらします
これで、ドメインモデルのMetadataType
属性を取り除き、UIレイヤー(MVCアプリケーション自体)にMyDomainModelMetadata
クラスを持たせることができます。
説明のためにありがとうございます。 –
あなたの答えを拡大してくれてありがとう。本当に面白いと非常に興味深い。 –