【问题标题】:Should I bring two entities together at the Service layer, the Repository layer, or make a repository for the join of the two?我应该在服务层、存储库层将两个实体放在一起,还是为两者的连接创建一个存储库?
【发布时间】:2011-10-21 07:51:41
【问题描述】:

我正在为非营利组织开发网络应用程序。 (该应用程序注册当天的工人,跟踪他们的个人信息,接受工作订单,并提供一个界面来将注册的工人分配给工作订单)我在 SQL Server 中有大约 8 个表。我从 Sanderson 关于 MVC 的书开始,并尝试实现他推荐的模式:IoC、关注点分离、DI...

这是我的上下文定义:

    public DbSet<Person> Persons { get; set; }
    public DbSet<Worker> Workers { get; set; } //All workers are persons, but not all persons are workers.       
    public DbSet<WorkerSignin> WorkerSignins { get; set; } //1 entry per worker, per day (barcode scanner)
    public DbSet<Image> Images { get; set; }
    public DbSet<Employer> Employers { get; set; }  //1 employer has many work orders
    public DbSet<WorkOrder> WorkOrders { get; set; }  //1 work order has many work assignments
    public DbSet<WorkAssignment> WorkAssignments { get; set; } //1 assignment -> space for worker
    public DbSet<WorkerRequest> WorkerRequests { get; set; }
    public DbSet<Lookup> Lookups { get; set; }    //configuration, dropdowns, other stuff

该应用程序已经投入生产了几个月——非营利组织有临时输入过去的订单和数据以用于报告目的,因此创纪录的数量正在迅速增长。他们遇到了一些性能瓶颈,当我修复它们时,我想在正确的层修复它们。

在多个实例中,我需要显示来自多个表的信息。例子:

  1. Worker 的显示从 Person 中提取名字和姓氏(使用 EF 集合)
  2. 从 Worker 和 Person 中提取 WorkerSignin 的显示
  3. 从 WorkOrder 中提取的 WorkAssignment 的显示

那么,在 #1 的情况下,是让我的 Worker 服务拉入 Person 服务,还是让 Worker Repository 拉入 Person 存储库?或者,我应该创建一个新的存储库,例如结合来自 Person 和 Worker 表的信息的“CompleteWorker”吗?

【问题讨论】:

    标签: c# asp.net-mvc entity-framework model-view-controller separation-of-concerns


    【解决方案1】:

    您的存储库不应了解除它们操作的实体之外的任何实体。就我个人而言,我发现处理这种情况的最佳方法是让我的存储库公开一个返回 IQueryable 的方法或属性,以便我可以在我的服务层中执行连接。

    所以要回答您的问题,您的 Worker 服务将同时依赖于 Worker 存储库和 Person 存储库。

    或者是您的数据库和模型设置,以便您可以简单地使用投影或Include 方法来检索您正在寻找的特定数据?

    【讨论】:

    • 我不熟悉投影。我会阅读并检查它。据我了解,我可以Include(p =&gt; p.Worker);我将对其进行测试,看看性能如何。我读到 other places 不鼓励将 IQueryable 暴露在存储库层之后,但由于我是这个项目中唯一的编码人员,也许这是可以容忍的。
    • @JCii 关于如何正确处理存储库实现有很多意见。就我个人而言,我发现公开 IQueryable 的灵活性超过了缺点。除此之外,Include 的使用非常高效,因为它在一个查询中获取所有请求的数据。
    【解决方案2】:

    在您的服务层使用许多存储库与服务层建立逻辑。保持存储库层清洁。即服务 A 可能有存储库 A、存储库 B、存储库 C。使用依赖注入将存储库注入您的服务。

    public class ServiceA
    {
    
     public PersonWorkerDTO GetPersonWorker()
     {
          RepositoryA.GetSomething();
          RepositoryB.GetSomething();
          RepositoryC.GetSomething();
     }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 2012-03-10
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 2017-02-02
      相关资源
      最近更新 更多