以下是我的问题,然后我将为您介绍这些问题的背景:
我更喜欢使用方法 2 作为我的应用程序设计,那么有没有办法像方法 1 一样提供过滤,而不引入对非业务代码的引用,也不允许访问 Core 项目中的数据库模型?
你如何处理代码重用?每个对象的命名空间类似于 Project.Core.Domain 或 Project.Core.Services,但如果将命名空间设置为类似于 CompanyName.Core.Domain 之类的名称,那么当它未存储在该项目中时,会感到很奇怪。目前,我正在复制源代码文件并重命名命名空间来处理这个问题,但我想知道是否有一种组织方式来处理这个问题或者我没有想到的其他东西?
我正在使用的技术:
- ASP.NET MVC 3
- Linq 到 SQL
- 结构图
- 起订量
- 测试
方法一:
以下是我用来设置 Web 项目的方式:
Data 项目将包含所有存储库和 Linq 数据上下文。在存储库中,我将使用 IQueryable 从数据库中返回一组对象。
public IQueryable<Document> List()
{
return from d in db.Documents
select d;
}
这使我可以设置静态方法的过滤器。这些也存储在数据项目中。
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);
}
因此,存储库只需提供一个 ListAll 方法,将所有项目作为 IQueryable 对象返回,然后服务层将确定如何在返回数据子集之前对其进行过滤。
我喜欢这种方法,它使我的存储库更干净,同时将大部分代码留在了服务中。
方法二
以下是我目前设置 Web 项目的方式:
使用洋葱架构:
- 核心:包含业务领域模型、应用程序的所有接口和服务类实现。
- 基础设施:包含存储库实现、Linq 数据上下文和映射类,以将 Linq 数据库模型映射到业务模型。
由于我将业务代码与数据库代码分开,因此我不想在 Core 项目中添加对 Linq 之类的引用来访问 IQueryable。所以,我不得不在存储层执行过滤,将数据库模型映射到域模型,然后将域对象的集合返回给服务层。这可以将其他方法添加到我的存储库中。