1

MVC パターンとエンティティ フレームワーク 4.1 を使用しています。モデル(M)、ビュー(V)、コントローラー(C)の3つのプロジェクトがあります。

                         M <-------- V --------> C
                         ^                       |
                         |_______________________|

プロジェクト参照のコントローラーとモード プロジェクトを表示します。コントローラー プロジェクトは、モデル プロジェクトを参照します。

Model と View の間に別のプロジェクトがあります。たとえば、プロジェクト MV には、インターフェイスといくつかのコンバーターが含まれています (以下で説明します)。モデル プロジェクトは MV を参照します。参考MVもあわせてご覧ください。しかし、MV は独立しており、どのプロジェクトもモデルもビューも参照しません。

I Have my POCO オブジェクト (エンティティ) のモデルでは、これらは物理データベースの設計を定義します。モデルをビューから分離したい、つまり、モデルがビューに依存しないようにしたいので、モデルには独自のエンティティがあり、ビューにも独自のエンティティがあります。

たとえば、オブジェクトの下にある View 名前空間では、次のようになります。

          public class EntityA : InterfaceMV
          {
             public string Property1 { get; set; }
             public int Property2 { get; set; }
             EntityB entityB;   <--- refrences an entity in the same namespace              
          }

モデル名前空間には、以下のオブジェクトがあり、実際には同じ属性が含まれています。

         public class EntityA : InterfaceMV
         {
             public string Property1 { get; set; }
             public int Property2 { get; set; }
             EntityB entityB;  <-- foreign key to an entity in the same namespace
         }

モデルとビューで共有されているエンティティがないため、ビューからモデルに直接アクセスしてコンテキストを使用してデータを取得するときに問題が発生するため、ビューから次のようにします。

          using (DBContext context = new DBContext())
          {
              Namespace.Model.EntityA a = context.EntitiesA.Find(id);
          }

モデルとビューは異なるエンティティを使用するため (同じ属性と同じ名前を持っているにもかかわらず、異なる名前空間に属しているため、異なるオブジェクトとして扱われます)、データをモデル オブジェクトからビュー オブジェクトに変換する必要があります。この変換は、上記のプロジェクト MV に含まれるインターフェイス (InterfaceMV) にあるコンバーター (インターフェイス) を使用して行われます。InterfaceMV は次のとおりです。

public interface IDataTypeConverterEntityA
{
    string Property1 {get; set;}
    int Property2 {get; set; }
}

InterfaceMV は、モデルの EntityA とビューの EntityA によって実装されます。したがって、ビューからモデルからデータを取得したら:

         Namespace.Model.EntityA a = context.EntitiesA.Find(id);

「a」オブジェクト (Namespace.Model.EntityA 型) をビューで同等のものに変換する必要があります。

         EntityA aConverted = DataTypeConverterEntityA.Convert<Namespace.Model.EntityA, EntityA>(a);

コンバーターは次のようになります (クラス DataTypeConverterEntityA 内にあります)。

    public static Y Convert<T, Y>(T itemToConvert) 
         where T : new(), IDataTypeConverterEntityA 
         where Y : new(), IDataTypeConverterEntityA
    {
        return new Y 
                {
                    property1 = itemToConvert.property1,
                    property2 = itemToConvert.property2                        
                };
     }

基本的に、DB 内のテーブルを表す POCO エンティティがあり、いくつかのビジネス クラスがあり、コンバーターを使用して一方から他方に移動します。

問題は次のとおりです。1.- interfaceMV を含むプロジェクト MV はモデルもビューも参照しないため、convert メソッドはスカラー型のみを変換できますが、たとえば EntityB プロパティなどの他の型は変換できないため、変換されたオブジェクト aConverted を取得すると景色:

// I retrieve the matching entity from the context
EntityA aConverted = DataTypeConverter.Convert<Namespace.Model.EntityA, EntityA>(a);

EntityB を取得するためにデータベースに別の要求を行う必要があります。次に、それを変換し、最後に次のようにしてビューから EntityA.entityB に割り当てます。

// I retrieve the matching entity from the context
Namespace.Model.EntityA a = context.EntitiesA.Find(id);
EntityA aConverted = DataTypeConverterEntityA.Convert<Namespace.Model.EntityA, EntityA>(a);

// Inject values into the entity
Namespace.Model.EntityB b = context.EntitiesB.Find(id);
EntityB bConverted = DataTypeConverterEntityB.Convert<Namespace.Model.EntityB, EntityB>(b);

aConverted.entityB = bConverted;

2.- ご覧のとおり、ビューは独自のエンティティを使用するため、ビューからはデータベース要求から受け取ったオブジェクトを処理できないため、エンティティごとにコンバーターが必要です.....そして明らかに、インターフェイスを実装する必要がありますモデルのエンティティとビューのエンティティの各エンティティ。

これの原因は、モデル プロジェクトを完全に分離したことです。それは独自のエンティティを使用しており、ビューも独自のエンティティを使用しています。

エンティティ (EntityA、EntityB、....) を 1 か所だけに保持し、モデルとビューの間で共有すると、この問題が解決する可能性があります.... データ型コンバーターの使用を避けます。

だから私の質問は: 毎回データ型コンバーターを使用しないようにするためのより良いアプローチはありますか? それとも、モデルをビューから分離するため、このアーキテクチャは優れていると思いますか? このアプローチでは、ビューでエンティティを変更しても、モデルには独自のエンティティがあるため影響を受けません。私の問題は、毎回データ型コンバーターを使用することです....

何か案は?

4

2 に答える 2

3

クラスごとに独自のコンバーターを作成する代わりに、AutoMapperを見てください。これにより、多くのコーディングから解放されます。

于 2013-06-03T21:15:12.400 に答える