这里是我的问题,然后我给你他们的背景:咨询
我宁愿使用方法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的参考。所以,我必须在存储库层执行过滤,将数据库模型映射到域模型,然后将一组域对象返回到服务层。这可能会将其他方法添加到我的存储库中。