我正在为非营利组织开发一个网络应用程序。 (该应用程序注册当天的工人,跟踪他们的个人信息,接受工作订单,并提供一个接口,将注册工人分配到工作单)我在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的情况下,最好让我的工作服务拉入人员服务,还是工作者资源库拉入人员存储库?或者,我应该创建一个新的Repository,比如'CompleteWorker',它结合了Person和Worker表中的信息?
答案 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();
}
}