【问题标题】:Where to store Ninject IKernel in a web application?在 Web 应用程序中将 Ninject IKernel 存储在哪里?
【发布时间】:2011-03-26 08:44:22
【问题描述】:

总的来说,我是国际奥委会的新手,我有点难以理解我正在尝试做的事情是否有意义。我有一个 Web 表单应用程序,我想在其中创建一个模块来为我定义一些绑定。绑定将用于将存储库注入我的业务经理类,允许我对业务经理进行单元测试。此外,我想使用容器将实体框架上下文注入到我的存储库中,这样它们每个 http 请求都共享相同的上下文。所以这就是我想知道的:

  1. 我了解我需要使用相同的内核实例来管理我的对象创建及其生命周期。例如,如果我想要一个每个 httprequest 类型的场景,我需要内核实例在该时间段内可用。如果我需要一个单例怎么办?然后它必须以某种方式在应用程序范围内。那么我到底在哪里存储 IKernel 实例呢?看来我可能想在我的 Global.asax 中将其设为静态,这是正确的方法吗?线程安全是否值得关注?

  2. 由于我使用 Bind 来定义我的绑定,当我不应该从 UI 引用我的数据访问层时,如何在 Web/UI 层中进行该定义?我的参考看起来像 .Web --> .Business --> DataAccess。似乎我想告诉内核“嘿管理我的数据访问实例,但在编译时没有对它们的引用。”像这样的绑定:

//Any object requesting an instance of AdventureWorksEntities will get an instance per request Bind<AdventureWorksEntities>().ToSelf().InRequestScope();

我觉得我可能处理不正确,谢谢。

【问题讨论】:

标签: c# dependency-injection inversion-of-control ioc-container ninject


【解决方案1】:

关于第 1 部分 - 看看 Ninject.Web 扩展 - 它在应用程序级别保留了一个内核。然后,您也可以在其中管理其他生命周期较短的资源。

另外,请在此处查看有关 EF 和 L2S DataContext 管理 wrt Ninject 和 DI 的问题和示例(最近几周出现)

更新:This answer to another question from the same OP is far more concrete(有一个 KernelContainer 类,有一个 .Inject( object) 和一个 .Kernel

【讨论】:

  • Ruben 我查看了 Ninject.Web,它看起来确实是我一直在寻找的东西。我猜这个扩展利用了下面的一些“全局”静态内核引用,本质上是通过使其成为 Global.asax 的静态属性来完成我自己正在做的事情。但是,沿着 Ninject.Web 路径走下去,我不需要担心线程安全,因为我确信他们已经解决了这个问题。
  • @e36M3 酷把手/车辆(我是 BH5 Blitzen :D)。你有它,减去“静态”推断——它是每个 HttpApplication 一个(每个进程和/或 AppDomain 可以有 >1 个),这可能会略有不同。确保您查看了其他文章 - 您需要在处理流程中的适当位置提交您的数据库工作,而不是期望 Ninject 只是通过 IDisposable 等在正确的时间完成它。 - Ninject 确实 Dispose,但异步一段时间后 - 不一定在请求处理期间。
  • 谢谢鲁本,我会做更多的挖掘工作。我知道必须有一种方法让它在请求结束时自动提交实体框架上下文(有点像 NHibernate),我将对以前的帖子进行一些扫描,看看我是否能找到类似的东西。现在我在“事务”中有最后一个业务经理负责调用 SaveChanges 方法。再次感谢。
  • @e36M3:在程序控制下明确地拥有类似的东西并没有错(尽管 obv 以某种方式使其保持干燥 - 有些人通过标准调用和/或重试策略等来控制它。 , 其他人去城里做 AOP 和其他不同程度的品味/过度工程:D)
【解决方案2】:

这实际上取决于您的网络应用程序的复杂性。

听起来你有一个业务和一个数据访问层;我个人会拥有一个“基础设施”层,用于存储我的 DI 存储库和辅助类。

【讨论】:

  • 谢谢约翰,我认为您的建议确实是避免层之间耦合的唯一方法。我没有使用任何其他容器,但我想如果配置是基于 XML 的,这可以避免,这意味着容器将在运行时解析 DLL。
猜你喜欢
  • 2011-02-18
  • 1970-01-01
  • 2013-08-01
  • 2010-11-11
  • 2013-11-20
  • 2021-05-03
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
相关资源
最近更新 更多