1

試圖使用EF和Model第一種方法創建MVC項目。首先使用MVC存儲庫模式的EF模型

爲了以Web和數據部分鬆散耦合的方式實現它,我試圖實現存儲庫模式,但是在閱讀了很多文章之後,我仍然試圖掌握我的Repository接口應該使用哪些對象返回或者他們應該如何綁定/映射到我的MVC項目中的'M'模型。

這是我所問的一個非常簡單的例子。

//Repository Interface 
public interface IMemberRepository 
{ 
    Member GetById(int id); 
    IEnumerable<Member> FindByName(string name); 
} 

//Repository Interface Implementation 
public class MemberRepository : IMemberRepository 
{ 
    //My DB Context object created by EF 
    private MyContainer context; 

    public MemberRepository(MyContainer context) 
    { 
     this.context = context; 
    } 

    public Member GetById(int id) 
    { 
     return context.Members.SingleOrDefault(x => x.Id == id); 
    } 

    public IEnumerable<Member> FindByName(string name) 
    { 
     return context.Members.Find(x => x.name == name); 
    } 

} 

因此,使用Ninject作爲我的DI框架,我可以從我的控制器如下稱之爲:

public class GroupsController : Controller 
{ 
    public ViewResult Find(string name) 
    { 
     IMemberRepository repo = 
      ObjectFactory.Instance.CreateInstance<IMemberRepository>(); 
     return repo.FindByName(name); 
    } 
} 

在這一點上,我只是不明白怎麼我的會員對象(從EF模型)應該綁定/映射到我的'MVC'成員模型對象。看來我必須缺少某種映射層,或者我完全偏離軌道。如果我直接引用我的EF生成的類,那感覺就像我否定了使用接口和DI框架的觀點。任何意見或方向在這一點上,將不勝感激。

回答

3

你的IMemberRepository接口及其實現MemberRepository看起來很對我。這也是我構建數據庫代碼的方式。移動到MVC世界,我會創建從您的數據模型填充的視圖模型。這將使您可以靈活地添加視圖中所需的任何屬性或其他屬性。

這將是工作流程:

  1. 取物(S)從資源庫與您的存儲庫對象(S)
  2. 返回視圖模型的所有數據
  3. 填充視圖模型對象的從控制器的視圖
+0

所以你說在第2步控制器會以某種方式填充我的視圖模型,然後返回它?那並不意味着我的控制器將與我的數據模型緊密耦合?我可能錯過了一些東西。 – cdlong 2013-02-19 17:18:13

+0

@cdlong - 您可以在控制器中進行映射,也可以在中間層進行映射。這是你做出的決定。無論你選擇什麼,如果你想使用視圖模型,你必須在某個地方進行映射。 – 2013-02-19 20:38:26

+0

Ek0nomik - 感謝您的幫助。想想我終於開始瞭解更多。 – cdlong 2013-02-19 21:26:11