目前我们已经在工作中实现了一个存储库模式。我们所有的存储库都位于它们自己的接口后面,并通过 Ninject 映射。我们的项目非常大,我正在尝试解决这种模式的一些怪癖。
首先,在一些控制器中,我们需要在同一个控制器中拥有超过 10 到 15 个存储库。当请求这么多存储库时,构造函数变得相当丑陋。在您调用多个存储库的方法后,第二个怪癖就会显现出来。在处理完多个存储库之后,我们需要调用 SaveChanges 方法,但是我们应该在哪个存储库上调用它呢?每个存储库都有一个。所有存储库都注入了相同的实体框架数据上下文实例,因此选择任何随机存储库来调用 save 都将起作用。只是看起来很乱。
我查看了“工作单元”模式并提出了一个我认为可以解决这两个问题的解决方案,但我对这个解决方案并不是 100% 有信心。我创建了一个名为DataBucket
.
// Slimmed down for readability
public class DataBucket
{
private DataContext _dataContext;
public IReportsRepository ReportRepository { get; set; }
public IEmployeeRepository EmployeeRepository { get; set; }
public IDashboardRepository DashboardRepository { get; set; }
public DataBucket(DataContext dataContext,
IReportsRepository reportsRepository,
IEmployeeRepository employeeRepository,
IDashboardRepository dashboardRepository)
{
_dataContext = dataContext;
this.ReportRepository = reportsRepository;
this.EmployeeRepository = employeeRepository;
this.DashboardRepository = dashboardRepository;
}
public void SaveChanges()
{
_dataContext.SaveChanges();
}
}
这似乎解决了这两个问题。现在SaveChanges
数据桶本身只有一种方法,您只注入一个对象,即数据桶。然后,您可以将所有存储库作为属性访问。数据桶看起来会有点凌乱,因为它会在其构造函数中接受我们的所有(很容易 50 或更多)存储库。
添加新存储库的过程现在包括:创建接口、创建存储库、在 Ninject 中映射接口和存储库,以及向数据存储桶添加属性并填充它。
我确实想到了一种替代方法,可以消除上面的步骤。
public class DataBucket
{
private DataContext _dataContext;
public IReportsRepository ReportRepository { get; set; }
public IEmployeeRepository EmployeeRepository { get; set; }
public IDashboardRepository DashboardRepository { get; set; }
public DataBucket(DataContext dataContext)
{
_dataContext = dataContext;
this.ReportRepository = new ReportsRepository(dataContext);
this.EmployeeRepository = new EmployeeRepository(dataContext);
this.DashboardRepository = new DashboardRepository(dataContext);
}
public void SaveChanges()
{
_dataContext.SaveChanges();
}
}
这几乎消除了 Ninject 中的所有存储库映射,因为它们都在数据桶中实例化。所以现在添加新存储库的步骤包括:创建接口、创建存储库、向数据桶添加属性和实例化。
你能看出这个模型有什么缺陷吗?从表面上看,以这种方式使用我们的存储库似乎更方便。这是以前解决过的问题吗?如果是这样,解决这个问题的最常见和/或最有效的方法是什么?