簡體   English   中英

這兩個實體中的哪個實現在ASP.net MVC中更好

[英]Which of those two entities implementations are better in ASP.net MVC

我是ASP.net MVC的初學者。 並且比WebForms更喜歡它。

因此,我決定啟動一個包含約6個表的項目:

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

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

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

在Abstract文件夾中,有6個接口IGalleryISessions等。每個接口都具有以下內容:

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

    }
}

Concrete文件夾中還有另外7個類: EFDbGalleryEFDbSessions ...和EFDbContext ,它們繼承自DbContext類。

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

現在,當我想到它時,我發現我可以創建一個定義所有實體的接口,而在實現該接口的Concrete文件夾中只有一個類。


我真的不知道有什么更好的方法:

6個接口 ,每個實體6個類

要么

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

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

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

然后讓您的ORM類實現存儲庫接口。

class MyDbContext : DbContext , IRepository
{

}

現在,在這一點上,要回答您的問題,我應該使用6個類和6個接口還是1個類和1個接口,答案是肯定的否!

典型的模式需要一個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 I通常會將ACTUAL EF代碼(即具體的存儲庫)重構為單獨的程序集,以防萬一您決定從項目中刪除EF。

我將使用7個類,因為它們將承擔不同的職責。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM