諮詢

0

這裏是我的問題,然後我給你他們的背景:諮詢

  • 我寧願使用方法2作爲我的應用程序設計,所以是有沒有一種方法可以像方法1一樣提供過濾功能,而不會引入對非業務代碼的引用,也不允許訪問Core項目中的數據庫模型?

  • 你如何處理代碼重用?每個對象的名稱空間都是類似於Project.Core.Domain或Project.Core.Services,但是如果覺得奇怪,當名稱空間沒有存儲在該項目中時,它會像CompanyName.Core.Domain一樣。目前,我正在複製源代碼文件並重命名命名空間來處理這個問題,但是我想知道是否有組織方式來處理這個問題或者我沒有想到的其他問題?

技術我使用的是:

  • ASP.NET MVC 3
  • LINQ到SQL
  • StructureMap
  • 起訂量
  • MSTest的

方法1:


以下是我用來設置我的web項目: enter image description here

數據項目將包含所有存儲庫,和LINQ數據上下文。在存儲庫中,我會使用IQueryable從數據庫中返回一組對象。

public IQueryable<Document> List() 
{ 
    return from d in db.Documents 
      select d; 
} 

這使我可以設置靜態方法的過濾器。這些也存儲在Data項目中。

public static IQueryable<Document> SortByFCDN(this IQueryable<Document> query) 
{ 
    return from d in query 
      orderby d.ID 
      select d; 
} 

在服務層,可以像這樣應用過濾器。

public IPagedList<Document> ListByFCDN(int page, IConfiguration configuration) 
{ 
    return repository.List().SortByFCDN().ToPagedList(page, configuration.PageSize, configuration.ShowRange); 
} 

因此,存儲庫將只需要提供返回的所有項目,如一個IQueryable對象,然後將服務層將確定如何返回數據的所述子集之前過濾下來了ListAll方法。

我喜歡這種方法,它使我的存儲庫更清潔,同時在服務中留下大量代碼。

方法2


下面是我目前的設置我的web項目: enter image description here

使用洋蔥結構:

  • 核心:包含業務域模型,所有的接口對於應用程序和服務類實現。
  • 基礎架構:包含存儲庫實現,Linq數據上下文和映射類,以將Linq數據庫模型映射到業務模型。

因爲我將業務代碼與數據庫代碼分開,所以我不想在Core項目中添加對Linq等參數以訪問IQueryable的參考。所以,我必須在存儲庫層執行過濾,將數據庫模型映射到域模型,然後將一組域對象返回到服務層。這可能會將其他方法添加到我的存儲庫中。

回答

0

這是我落得這樣做:

1)創建於核心項目的過濾枚舉對象。

public enum FilterType 
{ 
    SortFCDN 
} 

2)在服務類(也內的核心項目),這樣做:

public IPagedList<Document> ListByFCDN(int page) 
    { 
     Dictionary<FilterType, object> filters = new Dictionary<FilterType, object>(); 

     filters.Add(FilterType.SortFCDN, ""); 

     return repository.List(page, filters); 
    } 

3)在庫(基礎設施項目下):

public IPagedList<Document> List(int page, Dictionary<FilterType, object> filters) 
    { 
     //Query all documents and map to the model. 
     return (from d in db.DbDocuments 
       select d).Filter(filters).Map(
        page, 
        configuration.Setting("DefaultPageSize", true).ToInt(), 
        configuration.Setting("DefaultShowRange", true).ToInt()); 
    } 

4)在Infrastructure項目中創建一個過濾器類:

public static class DocumentFilters 
{ 
    public static IQueryable<DbDocument> Filter(this IQueryable<DbDocument> source, Dictionary<FilterType, object> filters) 
    { 
     foreach (KeyValuePair<FilterType, object> item in filters) 
     { 
      switch (item.Key) 
      { 
       case FilterType.SortFCDN: 
        source = source.SortFCDN(); 
        break; 
      } 
     } 

     return source; 
    } 

    public static IQueryable<DbDocument> SortFCDN(this IQueryable<DbDocument> source) 
    { 
     return from d in source 
       orderby d.ID 
       select d; 
    } 
} 

服務層(核心項目)可以決定在查詢執行之前應用哪些過濾器並將這些過濾器傳遞到存儲庫(基礎架構項目)。只要每個FilterType應用一個,就可以應用多個過濾器。

過濾器字典可以保存過濾器的類型以及需要傳入過濾器的任何值/對象。新的過濾器也可以很容易地添加。