Entity framework 4 服务层/存储库模式

Entity framework 4 服务层/存储库模式,entity-framework-4,asp.net-mvc-3,repository-pattern,unit-of-work,service-layer,Entity Framework 4,Asp.net Mvc 3,Repository Pattern,Unit Of Work,Service Layer,我正在使用EF4的服务层/存储库/工作单元模式构建一个MVC应用程序 我对逻辑有点困惑。我知道关键是要将系统解耦,但我有点困惑 因此MVC控制器调用服务来填充视图模型。那么说MVC应用程序与服务层耦合安全吗 然后,服务层调用存储库来获取和持久化对象。那么,可以安全地说服务层依赖于存储库吗 存储库利用EF4获取数据并将其持久化到SQL server,因此我假设存储库依赖于EF4,而EF4又依赖于SQL server 工作单元在哪里都合适 有什么例子吗? 谢谢 Sam 朱莉·勒曼(Julie Ler

我正在使用EF4的服务层/存储库/工作单元模式构建一个MVC应用程序

我对逻辑有点困惑。我知道关键是要将系统解耦,但我有点困惑

因此MVC控制器调用服务来填充视图模型。那么说MVC应用程序与服务层耦合安全吗

然后,服务层调用存储库来获取和持久化对象。那么,可以安全地说服务层依赖于存储库吗

存储库利用EF4获取数据并将其持久化到SQL server,因此我假设存储库依赖于EF4,而EF4又依赖于SQL server

工作单元在哪里都合适

有什么例子吗? 谢谢

Sam

朱莉·勒曼(Julie Lerman)在DNR电视台上做了一个很好的节目,谈到第9频道还有一个关于创建和测试存储库的节目

与之相关的一般事情是在Nhibernate中创建工作单元的抽象,它将是会话,在EF中是您的上下文,并将会话或上下文传递到您的存储库中,作为测试的一部分,您可以伪造连接以使用词汇列表

希望这些帮助


Iain

您对分层的假设是正确的。您的EF上下文是工作单元。通常,您将通过接口将其抽象出来,然后将构造函数注入到每个存储库中以进行CRUD操作。另一种方法是在UoW接口上公开存储库(我更喜欢前者)。无论哪种方式都可以更轻松地对每一层进行单元测试。然后,在服务层内对UnitOfWork进行一次保存调用,将在所有存储库中保存所有更改


下面是从单元测试的角度来看UoW,但也包括存储库。在它引用MVC控制器中的存储库的地方,您将拥有另一个中介服务层。

我开始将工作单元隐藏在较低层的某个地方,但这样做是错误的。经过一些经验之后,我的意见是:

  • 如果是整体式应用,控制器和下层应可访问工作单元
  • 对于分布式应用程序(UI和BL位于不同的服务器上),UnitOfWork应该可以通过业务层facade(远程调用的服务层)和较低层访问
原因是上面提到的层定义了什么是“业务事务”=什么是当前工作单元。只有该层知道何时要将更改提交到数据存储。这样做允许服务组合(代码重用)。我讨论了类似的问题,并进行了讨论