這裏是我的問題,然後我給你他們的背景:諮詢
我寧願使用方法2作爲我的應用程序設計,所以是有沒有一種方法可以像方法1一樣提供過濾功能,而不會引入對非業務代碼的引用,也不允許訪問Core項目中的數據庫模型?
你如何處理代碼重用?每個對象的名稱空間都是類似於Project.Core.Domain或Project.Core.Services,但是如果覺得奇怪,當名稱空間沒有存儲在該項目中時,它會像CompanyName.Core.Domain一樣。目前,我正在複製源代碼文件並重命名命名空間來處理這個問題,但是我想知道是否有組織方式來處理這個問題或者我沒有想到的其他問題?
技術我使用的是:
- ASP.NET MVC 3
- LINQ到SQL
- StructureMap
- 起訂量
- MSTest的
方法1:
以下是我用來設置我的web項目:
數據項目將包含所有存儲庫,和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項目:
使用洋蔥結構:
- 核心:包含業務域模型,所有的接口對於應用程序和服務類實現。
- 基礎架構:包含存儲庫實現,Linq數據上下文和映射類,以將Linq數據庫模型映射到業務模型。
因爲我將業務代碼與數據庫代碼分開,所以我不想在Core項目中添加對Linq等參數以訪問IQueryable的參考。所以,我必須在存儲庫層執行過濾,將數據庫模型映射到域模型,然後將一組域對象返回到服務層。這可能會將其他方法添加到我的存儲庫中。