咨询

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

过滤器字典可以保存过滤器的类型以及需要传入过滤器的任何值/对象。新的过滤器也可以很容易地添加。