2013-06-03 28 views
1

我使用MVC模式和Entity Framework 4.1中使用的業務對象。我有三個項目:模型(M),視圖(V)和控制器(C)。實體框架 - MVC - 轉換模式中從數據庫中請求的數據類型(POCO對象)到視圖

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

查看項目引用控制器和模式項目。 控制器項目參考模型項目。

與模型之間以及查看還有另外一個項目,假設項目MV,與包含一個接口和一些轉換器(我將在下面解釋)。型號項目引用MV。也查看參考MV。但MV是獨立的,它沒有引用任何項目,既沒有模型也沒有視圖。

在我有我POCO對象(實體)的模型,這些定義物理數據庫設計。 由於我想從視圖中隔離模型,也就是說,我不希望模型依賴於視圖,模型有其自己的實體,視圖也有自己的模型。

例如在瀏覽命名空間我有以下對象:

  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); 
      } 

作爲模型和視圖使用不同的實體(儘管它們具有相同的屬性,並且它們,因爲它們是beloging到不同的命名空間視爲不同的對象相同的名稱),我將數據從模型對象轉換,以查看對象。這個轉換是通過使用一個轉換器(接口)完成的,我在上面評論的項目MV中包含的接口(InterfaceMV)中使用了轉換器(接口)。 InterfaceMV如下:

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

和InterfaceMV由模型中的EntityA和View中的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       
       }; 
    } 

Basicaly,我有我的POCO實體代表我的數據庫表,我有一些業務類和我使用C逆變器從一個移動到另一個。

的問題如下: 1。 - 作爲項目MV含有interfaceMV不引用既不模型也不認爲,轉換方法只能轉換標量類型而不是例如其他類型,如在視圖中aConverted所以一旦獲得EntityB屬性轉換後的對象:

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

我要做antoher請求數據庫來獲取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:正如你所看到的,我必須有一個轉換器因爲從視圖來看,每個實體都不能將從數據庫請求接收到的對象視爲視圖使用自己的權利s .....顯然我必須在每個實體中實現接口,在模型的實體中以及在View的實體中。

這種情況的原因是,我已經完全孤立的示範項目,它是利用自身的entites和視圖還利用自身。

也許保持實體(EntityA,EntityB,....)只在一個地方,Model和View之間共享他們會解決這個問題....使用的數據類型的轉換避免。

所以我的問題是:有沒有更好的方法來避免每次使用數據類型轉換器?或者你認爲這個架構是好的,因爲它將模型從視圖中分離出來?使用這種方法,如果您在View中更改實體,則該模型不受影響,因爲它有自己的實體。我的問題是每次使用數據類型轉換器....

任何想法?

回答

3

不要爲每個班級編寫自己的轉換器請看AutoMapper。它可以幫你節省大量的編碼。

1

不知道這是真的堆棧溢出問題(感覺太像「什麼對你的......意見」),但因爲你花時間來輸入了這麼長的解釋,我會使我的兩個美分:

我認爲你的設計過於複雜。有一句關於「解決方案的複雜性不應該超過問題複雜性」的說法,這就好像你已經完成了(很難說沒有關於你的問題的特定上下文知識)。對於它的價值,我發現這種「模式」是SoC和複雜性之間的最佳平衡:

  1. 數據項目。提供對數據存儲庫 (數據庫,XML等)的編程訪問。
  2. 域項目。提供業務邏輯/規則的實現。 I 也在這裏定義了我的DTO。
  3. UI項目。假設你正在開發一個用戶直接使用 一個工具,這個項目提供的網站,控制檯,或桌面 應用程序,並僅限於基本的驗證(被要求提供 值,例如)。

如果我需要哈希或加密例程,我傾向於將它們放置在第四個項目中,但它們也可能與域項目混爲一談。

鑑於這種設計,域項目引用的數據項目和UI項目引用域項目。大部分工作都發生在域項目中,數據項目通常只是數據存儲的包裝,UI項目將用戶請求路由到適當的域邏輯。

HTH。

相關問題