我正在取得进步,但仍然挣扎在一个多层MVC应用程序的工作单元。查看这里的示例:http://www.asp.net/entity-framework/tutorials/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application,UoW封装了所有的存储库,并为每个存储库提供了一个相同dbcontext的副本。然后,控制器可以使用存储库,如下所示:
var courses = unitOfWork.CourseRepository.Get(includeProperties: "Department");现在假设您有一个服务层,它访问存储库。您可以对其进行配置,使其对IUnitOfWork实现具有依赖性,然后通过统一传递EfUnitOfWork实现。然后,当服务完成某些任务时,它可以调用unitOfWork.context.SaveChanges()。但是,这种方法隐藏了服务的真正依赖关系;它需要的存储库。这也意味着测试服务需要构建一个完整的UoW。
所以我在想一定有一种不同的方法,我想知道下面的一条或者我上面提到的东西(或者别的什么!)正确的方法是:
中传递的一个副本来设置其所需的存储库。
请帮帮我!
詹姆斯
发布于 2011-12-02 09:29:16
是的,因此,在进一步探讨了这个问题之后,我得出了以下结论,因此,我认为我将在这里提出文件,以帮助其他人,或者,如果我的调查结果是错误的,我就可以得到纠正。
DbContext 是的工作单位。我只需要将这个工作单元传递到已实现的EFRepository类中。它不需要进入服务类。那么,服务类如何调用context.SaveChanges()以确保在没有DbContext实例的情况下协调所有相关的更改?它调用EFRepository.Save(),如下所示:
public void Save()
{
context.SaveChanges();
}使用这种方法,服务类只依赖于存储库。这将是明确的,可以模拟为测试。当Unity将所需的Repository对象注入到服务中时,它可以为每个存储库提供相同的DbContext。此外,只有存储库可以访问DbContext。
所有这一切可能是显而易见的,但这让我感到困惑。或者这可能是完全错误的,在这种情况下请告诉我!
詹姆斯
发布于 2011-12-01 17:54:15
服务层通常设计为让每个方法执行一个完整的操作。服务层方法负责处理工作单元。使用这种方法,工作单元不应该跨越对服务层的多个调用。
如果您想要在一起执行更大的更新块,则可以使用事务。创建一个新的TransactionScope,然后在其中调用几个服务层方法:
using(TransactionScope ts = new TransactionScope())
{
ServiceLayer.DoSomething();
ServiceLayer.DoSomethingElse();
ts.Commit();
}https://stackoverflow.com/questions/8345897
复制相似问题