3

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

我对逻辑有些困惑。我知道问题的关键是解耦系统,但我有点困惑。

因此,MVC控制器调用服务来填充视图模型。那么可以肯定的说MVC应用程序与服务层耦合了吗?

然后服务层调用存储库来获取和保存对象。那么说服务层依赖于Repository是安全的吗?

存储库利用EF4获取并持久数据到SQL服务器,所以我会假设存储库依赖于EF4,而EF4依赖于SQL Server。

哪里工作单位都格格不入。

任何的例子吗? 谢谢!

回答

4

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

  • 如果是monolitic应用程序UnitOfWork应该可以由Controller和低层访问。
  • 如果是分布式应用程序(UI和BL在不同的服务器上)UnitOfWork应该可以被业务层门面(用于远程调用的服务层)和较低层访问。

原因是上述图层定义什么是“业务交易”=什么是当前工作单元。只有该层知道何时将更改提交到数据存储。这样做可以实现服务组合(代码重用)。我讨论了类似的问题herehere

3

山姆,

朱莉·勒曼做了DNR电视良好的截屏,谈论this,也有另一种屏幕上投9频道,围绕创建并在测试库EF​​。

与这些相关的一般东西是在Nhibernate中创建工作单元的抽象,它将是Session,在EF中将是您的上下文并将该会话或上下文传递到您的存储库中,作为测试的一部分,您可以伪造连接使用一个名单的名单。

希望这些帮助。

Iain

1

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

这里的a nice article on MSDN从单元测试的角度来看待UoW,但也涵盖了知识库。从MVC控制器引用存储库的位置,您将拥有另一个中间服务层。