5

我有几个关于使用实体框架作为数据访问层在 MVC3 Web 应用程序中解耦域层和数据层的问题。

就目前而言,我的控制器完全依赖于 EF 类,并且在花了大部分时间阅读依赖注入之后,我试图将它们解耦。

我的第一个问题是 - 我是否需要将所有 EF 类有效地复制到我的业务层中?我显然不能再使用 EF 类了,所以在我看来,我需要创建每个正在使用的表类的副本才能使其正常工作。这是正确的吗?例如,如果我有 50 个 EF 类代表我的数据库中的 50 个表,我是否需要在我的业务层中创建 50 个新类?-> 然后无限期地维护它们?这听起来像是很多工作。

其次,我是否正确假设依赖关系被翻转,而不是业务层依赖于数据层,数据层最终变得依赖于业务层?

4

2 回答 2

3

对于您的实体的重复...这取决于 EF 的版本和您使用的方法。

如果您使用POCO 实体,那么您的模型与 EF 无关,因为您的实体不继承自EntityObject. 所以你不必复制你的实体。在运行时,由于代理实体,EF 将生成从您的 POCO 继承的动态类型,并添加所有 EF 管道以用于延迟加载......等等。

在任何情况下,请注意,由于 ASP.Net MVC,您总是会通过将一些模型类复制到所谓的视图模型中来结束,因此您可以强类型化您的视图。

其次,我是否正确假设依赖关系被翻转,而不是业务层依赖于数据层,数据层最终变得依赖于业务层?

不,数据层不应该知道业务层。

于 2013-03-20T09:32:26.093 回答
1

您可以将您的模型类放在一个单独的程序集中到您的上下文中。

如果这样做,您的数据层、业务层和网站都可以引用模型组件,但您可以隔离其他依赖项 - 例如,网站组件不会直接引用数据层,这意味着它没有也必须参考EF。

如果您首先使用代码,这很简单。

如果您首先使用数据库,则从上下文程序集中删除对模型 .tt 文件的引用。不要删除或移动它,而是在新模型装配中添加指向它的链接。

要添加链接,请在解决方案资源管理器中右键单击您的项目,然后选择“添加 -> 现有项目”。然后你会得到一个文件选择器对话框。该对话框上的“添加”按钮有一个下拉菜单,您可以在其中选择“添加为链接”。

于 2013-03-20T09:44:09.873 回答