在Web应用程序中存储Ninject IKernel的位置?

e36*_*6M3 6 c# dependency-injection ninject ioc-container inversion-of-control

我一般都是IOC的新手,而且我正在努力了解我想要做的事情是否有意义.我有一个Web表单应用程序,我想在其中创建一个模块来为我定义一些绑定.绑定将用于将存储库注入我的业务经理类,允许我对业务经理进行单元测试.此外,我想使用容器将Entity Framework上下文注入我的存储库,这样它们每个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();

我觉得我可能不正确地接近这个,谢谢.

Rub*_*ink 1

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

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

更新:对同一OP的另一个问题的回答更加具体(有一个带有 a和 a 的KernelContainer类).Inject( object).Kernel