我应该在服务层,存储库层中将两个实体放在一起,还是为两者的连接建立一个存储库?

时间:2011-08-06 03:18:34

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

我正在为非营利组织开发一个网络应用程序。 (该应用程序注册当天的工人,跟踪他们的个人信息,接受工作订单,并提供一个接口,将注册工人分配到工作单)我在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. 工人的显示从Person(使用EF集合)中提取名字和姓氏
  2. WorkerSignin的显示来自工人和人
  3. WorkAssignment的显示来自WorkOrder
  4. 因此,在#1的情况下,最好让我的工作服务拉入人员服务,还是工作者资源库拉入人员存储库?或者,我应该创建一个新的Repository,比如'CompleteWorker',它结合了Person和Worker表中的信息?

2 个答案:

答案 0 :(得分:1)

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

因此,要回答您的问题,您的Worker服务将依赖于Worker存储库和Person存储库。

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

答案 1 :(得分:0)

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

public class ServiceA
{

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

}