2013-02-25 77 views
0

我是ASP.net MVC的初學者。喜歡它比WebForms更多。這兩個實體中的哪一個實現在ASP.net中更好MVC

所以我決定開始包含約6表項目:

  1. 畫廊
  2. 管理員
  3. 會議
  4. SessionImages
  5. 信息
  6. 信息

我已經創建了兩個項目:FP.WebUIFP.Domain

在我的域名項目中,我創建了3個文件夾Abstract,ConcreteEntities

內摘要文件夾中有6個接口IGalleryISessions ..等等。每個接口都有這樣的事情:

namespace FP.Domain.Abstract 
{ 
    public interface IGallery 
    { 
     IQueryable<Gallery> Gallery { get; } 

    } 
} 

而且Concrete文件夾內有另一個7類:EFDbGalleryEFDbSessions ...和EFDbContext它從DbContext類繼承而來。

上面的每個類(EFDbContext除外)都實現了每個相應的接口。

現在,當我想到了,我發現我可以做一個接口,它定義了實現該接口Concrete文件夾內的所有實體,只有一個班。


我真的不知道什麼是更好的:

6接口6類爲每個實體。

OR

1接口1類返回所有實體。

回答

1

你似乎偶然發現了Repository模式。典型的架構決策是創建一個接口

interface IRepository 
{ 
    IQueryable<Gallery> Query { get; } 
} 

然後讓你的ORM類實現存儲庫接口。

在這一點上
class MyDbContext : DbContext , IRepository 
{ 

} 

現在回答你的問題,我應該使用6類和6個接口或1級和1個接口的回答是斷然NO!

典型的模式需要一個GENERIC接口(所以實際上你有6個接口,但是一個接口源,如果你需要額外的調用,你可以擴展通用)。

//Actually this implementation is edging on 
//Unit Of Work 
interface IRepository<T> 
{ 
    IQueryable<T> Query { get; } 
    void Insert(T item); 
    void SaveChanges(); 
} 

然後你的EfContext公開所有的接口。原因在於你的控制器通常只需要一個單獨的接口來工作,這使得控制器上的模擬/僞造測試變得更加容易(你不需要像GalleryControllerTest的InfoQuery那樣創建未使用方法的實現)。

如果您發現您需要針對任何接口都有特定於域的代碼,則可以擴展IRepository接口。

interface IGalleryRepository : IRepository<Gallery> 
{ 
    void SomeSpecialOperation(Gallery item); 
} 

最後,如果/當您開始引入控制反轉時,這種模式的實現將使生活更容易。

PS我通常會將實際EF代碼(即具體的存儲庫)重構爲一個單獨的程序集,這很簡單,以防萬一您決定從您的項目中刪除EF。

0

我會使用7類,因爲他們會有不同的責任。

+0

你能詳細點嗎? – amhed 2013-02-26 03:59:05

+0

http://en.wikipedia.org/wiki/Single_responsibility_principle – 2013-02-26 14:14:11

相關問題