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 か所だけに保持し、モデルとビューの間で共有すると、この問題が解決する可能性があります.... データ型コンバーターの使用を避けます。
だから私の質問は: 毎回データ型コンバーターを使用しないようにするためのより良いアプローチはありますか? それとも、モデルをビューから分離するため、このアーキテクチャは優れていると思いますか? このアプローチでは、ビューでエンティティを変更しても、モデルには独自のエンティティがあるため影響を受けません。私の問題は、毎回データ型コンバーターを使用することです....
何か案は?