【问题标题】:Disposing bound object in Ninject在 Ninject 中处理绑定对象
【发布时间】:2011-07-25 16:04:17
【问题描述】:

我在 Global.ascx 中绑定了一个 DonorContext 类的对象(它派生自 EntityFramework 的 DbContext),如下所示。

kernel.Bind<DonorContext>().ToSelf().InRequestScope().OnDeactivation(DisposeDonorContext);

我期待在请求结束时,Ninject 将调用 DisposeDonorContext 方法。但它永远不会被调用。

我可以从网上收集到的是,IDisposible 类型的对象会在超出范围时自动调用它们的 Dispose 方法。这在我的情况下没有发生,因此我正在尝试 OnDeactivation() 来处理 DonorContext (这也不会发生)。

任何想法为什么没有发生处置?

【问题讨论】:

    标签: asp.net-mvc-3 ninject


    【解决方案1】:

    Ninject 将自动调用实现IDisposable 的对象的 Dispose 方法(至少在我用最新版本测试它时发生了这种情况)。如果您没有发生这种情况,我怀疑问题在于您从未在应用程序的任何地方使用此DonorContext。所以它永远不会被实例化,也永远不会被释放。例如,如果您有一个控制器将此上下文作为构造函数参数:

    public class HomeController: Controller
    {
        private readonly DonorContext _context;
        public HomeController(DonorContext context)
        {
            _context = context;
        }
    
        public ActionResult Index()
        {
            return View();
        }
    }
    

    它应该工作。如果您有一个服务层将此上下文作为构造函数参数,然后您在控制器中使用此服务(使用构造函数注入),它也会起作用。归根结底,你必须有一个控制器,它需要一些依赖项,它本身可能是 DonorContext 或一些其他依赖项,它本身依赖于 DonorContext (存储库,服务,...),以触发依赖注入链。

    这就是说在你的控制器中使用诸如 DonorContext 之类的具体类型违背了在硬编码时使用依赖注入的目的。

    【讨论】:

    • Darin,实际上我是在我的控制器中注入服务层对象 UserManager。此 UserManager 对象包含 DonorContext 依赖项。我正在使用 [Inject] 属性来注入依赖项。 UserManager 的范围在默认的 ninject 范围内。我确信 DonorContext 对象是在我的服务层中创建并注入的,因为我正在使用它来加载正确发生的数据。
    • Darin,我新安装了 Ninject.MVC3 包,现在我可以看到 OnDeactivation() 调用了我的方法。感谢您的帮助。
    • +1 并且一切都是真实和正确的,但只是想明确表明它是 Ninject 的 System.Web 集成,正如 Ninject.MVC3 中所体现的那样,这就是这种情况 - 捕获所有处理在 Ninject 中是 GC 触发的缓存和收集机制,根据您的托管上下文可能会导致 OP 观察到的问题,即停用不会直接发生在 ASP.NET 处理周期中的适当位置
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2011-11-22
    • 2012-05-22
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多