首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何配置工作单元

如何配置工作单元
EN

Stack Overflow用户
提问于 2011-12-01 17:48:50
回答 2查看 1.5K关注 0票数 2

我正在取得进步,但仍然挣扎在一个多层MVC应用程序的工作单元。查看这里的示例:http://www.asp.net/entity-framework/tutorials/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application,UoW封装了所有的存储库,并为每个存储库提供了一个相同dbcontext的副本。然后,控制器可以使用存储库,如下所示:

代码语言:javascript
复制
var courses = unitOfWork.CourseRepository.Get(includeProperties: "Department");

现在假设您有一个服务层,它访问存储库。您可以对其进行配置,使其对IUnitOfWork实现具有依赖性,然后通过统一传递EfUnitOfWork实现。然后,当服务完成某些任务时,它可以调用unitOfWork.context.SaveChanges()。但是,这种方法隐藏了服务的真正依赖关系;它需要的存储库。这也意味着测试服务需要构建一个完整的UoW。

所以我在想一定有一种不同的方法,我想知道下面的一条或者我上面提到的东西(或者别的什么!)正确的方法是:

  • 服务接受相同的存储库参数以及IUnitOfWork。存储库与统一提供的dbContext副本连接在一起。EfUnitOfWork也与相同的副本连接。然后,服务可以像以前一样使用存储库,一旦完成,使用commit.
  • Service只需要一个IUnitOfWork,但是通过向它们传递IUnitOfWork.dbcontext

中传递的一个副本来设置其所需的存储库。

请帮帮我!

詹姆斯

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-02 09:29:16

是的,因此,在进一步探讨了这个问题之后,我得出了以下结论,因此,我认为我将在这里提出文件,以帮助其他人,或者,如果我的调查结果是错误的,我就可以得到纠正。

DbContext 的工作单位。我只需要将这个工作单元传递到已实现的EFRepository类中。它不需要进入服务类。那么,服务类如何调用context.SaveChanges()以确保在没有DbContext实例的情况下协调所有相关的更改?它调用EFRepository.Save(),如下所示:

代码语言:javascript
复制
public void Save()
    {
        context.SaveChanges();
    }

使用这种方法,服务类只依赖于存储库。这将是明确的,可以模拟为测试。当Unity将所需的Repository对象注入到服务中时,它可以为每个存储库提供相同的DbContext。此外,只有存储库可以访问DbContext。

所有这一切可能是显而易见的,但这让我感到困惑。或者这可能是完全错误的,在这种情况下请告诉我!

詹姆斯

票数 0
EN

Stack Overflow用户

发布于 2011-12-01 17:54:15

服务层通常设计为让每个方法执行一个完整的操作。服务层方法负责处理工作单元。使用这种方法,工作单元不应该跨越对服务层的多个调用。

如果您想要在一起执行更大的更新块,则可以使用事务。创建一个新的TransactionScope,然后在其中调用几个服务层方法:

代码语言:javascript
复制
using(TransactionScope ts = new TransactionScope())
{
  ServiceLayer.DoSomething();
  ServiceLayer.DoSomethingElse();
  ts.Commit();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8345897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档