2012-03-26 6 views
1

WebアプリケーションからアクセスするDataAccessプロジェクトにFluent NHibernate設定コードがあります。Fluent NHibernateとASP.NET MVCを使用したDRYモデル

NHibernate設定の一部として、データベースにマッピングするときに使用するモデルを定義しました。

public sealed class MyTypeMapping: ClassMap<MyType> 

このモデルMyTypeは私がビューに渡される私のWeb層で必要とモデルと同じです。また、RequiredDisplayNameのような追加のメタデータをこのモデルに追加したいと思います。

これは、データアクセスレイヤのモデルがウェブレイヤで必要なモデルと同じである一般的なシナリオであると確信しています。

これはどのようにして一般的に処理されますか?データアクセスレイヤのモデルに依存してビューを作成することは認められていますか、またはビューから詳細を抽象化するViewModelを作成するだけですか?

私は非常にORMに慣れていて、MVCプロジェクトのモデルフォルダの外に自分のモデルを置いてモデルを複製するのは気に入らないと感じています。

これはどのように処理しますか?

答えて

2

は、それが受け入れられた練習がない私にとっては、多分何人かの人々のためにデータアクセス層

でモデルのビューに依存することです。

また、単にビューから詳細を抽象化する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クラスを持たせることができます。

+0

説明のためにありがとうございます。 –

+0

あなたの答えを拡大してくれてありがとう。本当に面白いと非常に興味深い。 –

関連する問題