0

以下是我的问题,然后我将为您介绍这些问题的背景:

  • 我更喜欢使用方法 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。所以,我不得不在存储层执行过滤,将数据库模型映射到域模型,然后将域对象的集合返回给服务层。这可以将其他方法添加到我的存储库中。

4

1 回答 1

0

这就是我最终做的事情:

1)在Core项目中创建了一个过滤枚举对象。

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)在基础设施项目中创建一个过滤器类:

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 只应用一个,就可以应用多个过滤器。

过滤器字典可以保存过滤器的类型和需要传递到过滤器的任何值/对象。也可以轻松添加新过滤器。

于 2011-07-19T17:45:39.083 回答