【问题标题】:Decoupling Entity Framework in MVC3 ApplicationMVC3 应用程序中的解耦实体框架
【发布时间】:2013-03-20 09:23:53
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我创建了单独的视图模型供我的视图使用,并从我的 EF 模型中填充这些视图模型。
  • 我想你会发现现在有一种趋势是在你的控制器中使用 EF 模型(即使你正在耦合到 EF),只要你不将这些模型返回到通常的视图中不是什么大问题,除非你打算改变持久性框架,现在越来越少的理由来

标签: c# asp.net-mvc-3 entity-framework dependency-injection decoupling


【解决方案1】:

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

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

在任何情况下,请注意,由于 ASP.Net MVC,您最终总会将一些模型类复制到所谓的视图模型中,这样您就可以强类型化您的视图。

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

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

【讨论】:

  • 请原谅这个问题,但我怎么知道我是否在使用 POCO 实体?因为我是从 LINQ2SQL 过来的,所以它是全新的。我可以告诉你的是,我首先使用 DB 创建 EF 类,其余的由设计师完成——就像在 LINQ2SQL 中一样。如果 DAL 不知道 BL,那么 DAL 返回的“类型”是什么?数据集?我希望返回代表我的数据的正确类..
  • @Grant 您可以做的是查看您的实体是否继承或实现任何与 EF 相关的类/接口(EntityObject)
  • 我看不到对 EntityObject 的任何引用。我有我的 model.context.tt,然后是设计师。图表,然后是 model.tt,下面有一堆代表我所有表格的类。这是否意味着我正在使用 POCO 实体?
  • @Grant 如果您有 T4 模板(*.tt 文件)并且您的实体没有从任何与 EF 相关的类继承,那么可以。
【解决方案2】:

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

如果你这样做,你的数据层、业务层和网站都可以引用模型组件,但你可以隔离其他依赖项——例如网站程序集不会直接引用数据层,这意味着它也不必引用 EF。

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

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

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

【讨论】:

  • 如何删除对我的 model.tt 文件的引用?您是否建议这些 EF 类是我的域模型类,我应该这样使用它们?
  • 要删除对model.tt 文件的引用,请在解决方案资源管理器中右键单击它并选择“从项目中排除”
  • 而且,是的 - 因为 POCO 类本质上只是数据桶,所以使用它们在所有程序集之间移动数据变得越来越普遍。这样做的好处是导航属性(数据库的架构)在其中进行了编码,因此您可以在网站程序集中创建 Where 和 OrderBy 子句之类的内容,而无需引用 EF 甚至您的 @ 987654324@
  • 感谢尼古拉斯。但是model.tt文件下没有选项可以从项目中排除或删除..? - 我只能排除父 model.context.tt.. 而不是 model.tt
  • 应该有 - 您确定您正在查看“解决方案资源管理器”选项卡吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多