- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我对在我正在编写的 ASP.NET MVC 应用程序中使用依赖注入(inject)来管理我的 DBContext 还是有点陌生。
我正在尝试遵循文章 Managing Entity Framework DbContext Lifetime in ASP.NET MVC 中概述的方法.基本上,这种方法表示使用 Ninject 和依赖项注入(inject),并将我的 DBContext 作为参数添加到我的 Controller 中的构造函数。
此外,我正在一个基本 Controller 中实现它,或者我的所有 Controller 类都将派生。
这是可行的,但我遇到了以下问题。
此方法要求每个派生 Controller 类还实现一个构造函数,该构造函数接受我的 Controller 基类所需的任何参数。这不仅看起来像是我必须记住添加到任何新派生类的大量额外类型,而且还意味着如果我更改传递给构造函数的数据,那么我必须修改每个派生 Controller 类中的构造函数。
这为我的所有 Controller 类提供了一个 DBContext。但是我的模型中需要 DBContext 的其他类呢?我是否需要手动将实例传递给 DBContext 给所有这些类?或者有没有办法为这些类中的每一个使用 DI 来获取它们自己的 DBContext 副本?
最佳答案
This approach requires that every derived controller class also implements a constructor that accepts any arguments requires by my controller base class. Not only does this seem like a lot of extra typing that I must remember to add to any new derived class, but it also means that if I change the data passed to the constructor then I must modify the constructor in every derived controller class.
这是您可以选择在您的应用程序中使用 EF 的方法之一(重型 Controller ),IMO 它不是最干净的方法。而且您正确地注意到了自己的缺点。
如果我们将这种方法与设计原则联系起来,它会打破单一职责原则,因为 Controller 应该做更多的事情(获取或更新数据库),而不仅仅是收集数据并返回包含数据的适当 View 。业务规则如何, Controller 会应用它,如果您需要发送电子邮件, Controller 也会这样做。您应该有另一层专门为一组需求设计的业务/服务类,例如EmailHelper 将发送电子邮件。
它也违反了开闭原则,因为每次更改输入参数时都需要更改构造函数。
This gives me a DBContext for all my controller classes. But what about other classes in my model that need the DBContext? Should I need to manually pass the instance to the DBContext to all these classes?
就依赖注入(inject)而言,目标之一是直接在需要的地方注入(inject)依赖。如果您有一个需要 DbContext 的模型类,您应该将它注入(inject)到您的模型类构造函数中(大多数 DI 框架也支持属性注入(inject),但构造函数仍然是最喜欢的方法)。
使用 DI 框架,您将在一个地方(应用程序初始化代码)配置依赖项,然后每个需要依赖项的类只需在构造函数中接受它。
DI Container可以比作字典,key是interface,value是cooked object。设置完成后,您可以在整个应用程序中使用正确的 key 随时请求任何对象。
Or is there a way to use DI for each of these classes to get their own copy of the DBContext?
DI 框架支持不同的实例化方式,以允许控制实例的生命周期。通常,每个请求、每个线程和单例。更多信息 here .如果您希望每个 Controller 都获得 DbContext 的副本,则可以在设置 DbContext 实例化时使用每个请求配置。
替代解决方案:
我的大多数 MVC 应用程序都有一个服务层(一组应用业务规则的类)。这些类中的每一个都注入(inject)了 DbContext(不完全是 DbContext,而是 IDataContext)。 Controller 注入(inject)了它们检索或更新数据所需的服务类。
已经抽象出 IDataContext 背后的 DbContext,我可以在我的测试中设置一个 stub 数据上下文,或者明天如果我想从 EF 切换到 NHibernate 或更智能的 DI 框架,我将只需要实现 IDataContext 并更改依赖初始化代码。
希望这对您有所帮助。
关于c# - 将 DBContext 与依赖注入(inject)结合使用的后果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27220714/
我在 gobject 上阅读了一个维基百科页面,上面写着, Depending only on GLib and libc, GObject is a cornerstone of GNOME and
如何注册一个依赖属性,其值是使用另一个依赖属性的值计算的? 由于 .NET 属性包装器在运行时被 WPF 绕过,因此不应在 getter 和 setter 中包含逻辑。解决方案通常是使用 Proper
我一直在尝试将 ActionbarSherlock maven 依赖项添加到我的项目中 com.actionbarsherlock library 4.2.0 在我的 po
http://tutorials.jenkov.com/ood/understanding-dependencies.html#whatis说(强调我的): Whenever a class A us
我对所有这些魔法有点不清楚。 据我了解,依赖属性是从 DependencyObject 继承的,因此存储值: 如果分配了值(在本地字典中),则在实例本身中 或者如果未指定值,则从指向父元素的链接中获取
我刚刚更新了在 ASP.NET Framework 4.5.2 版上运行的 MVC Web 应用程序。我正在使用 Twilio 发送 SMS 消息: var twilio = new TwilioRe
我刚刚发现了一件令人生畏的事情。 spring 依赖坐标有两个版本。 项目依赖于 spring mvc 和 spring flow。有两组并行的依赖项。 Spring MVC 具有以下方案的依赖项
我正在尝试包含 的 maven 依赖项 org.jacorb jacorb 2.3.1 依赖已解决,但它导致另一个依赖 picocontainer 出现问题: [ERROR
我正在尝试在 Haskell 项目中包含特定版本的库。该库是住宿加早餐型的(用于 martix 操作),但我需要特定的 0.4.3 版本,该版本修复了乘法实现的错误。 所以,我的 stack.yaml
有谁知道如何制作依赖的 UIPickerView.例如,当我选择组件一的第 2 行时,组件二的标题会发生变化吗? 我在互联网上查找过,没有真正的答案,我尝试过使用 if 和 switch 语句,但它们
我正在编写一个用于验收测试的项目,由于各种原因,这依赖于另一个打包为 WAR 的项目。我已成功使用 maven-dependency-plugin 解压 WAR,但无法让我的项目包含解压的 WEB-I
或多或少我在 session 上大量构建我的网站(特别是重定向用户等),我很好奇这是否是一种危险的做法。禁用浏览器 cookie 保存的用户的大致比例是多少?我愿意接受任何建议:) 谢谢 最佳答案 s
开始玩 Scala futures,我被依赖的 futures 困住了。 让我们举个例子。我搜索地点并获得 Future[Seq[Place]]。对于这些地点中的每一个,我搜索最近的地铁站(该服务返回
或多或少我在 session 上大量构建我的网站(特别是重定向用户等),我很好奇这是否是一种危险的做法。禁用浏览器 cookie 保存的用户的大致比例是多少?我愿意接受任何建议:) 谢谢 最佳答案 s
我有一个二进制文件,需要一些 *.so 文件才能执行。现在,当我尝试在一些旧机器上执行它时,它会显示 /lib/libc.so.6: version `GLIBC_2.4' not found 如何将
我尝试使用 Dygraph 来表示图表,我在 https://github.com/danvk/dygraphs 中找到了代码,但是它有太多的依赖文件,我觉得很烦人。是否有一个文件可以容纳所有必需的
我正在处理一个 javascript 文件,该文件 a) 声明一个具有函数的对象,并且 b) 使用它期望在外部声明的散列调用该对象的 init 函数。我的 Jasmine 规范提示它找不到哈希,因为它
最近我一直在学习 Angular 并且进展顺利,但是关于依赖注入(inject)的一些事情我仍然不清楚。 是否有任何理由在我的 app.js 文件中声明我的应用程序的其他部分(服务、 Controll
考虑一个名为 foo 的表,它有 id (PRIMARY & AUTO_INCREMENT) 列。我正在向该表中插入一行,挑战从此时开始。 $db->query("INSERT INTO `foo`
我正在使用级联下拉 jquery 插件。 (https://github.com/dnasir/jquery-cascading-dropdown) 我有两个下拉菜单。 “客户端”和“站点”。 根据您
我是一名优秀的程序员,十分优秀!