使用Ninject指定实体框架上下文实现IDisposable



我正在按照下面的代码在我的服务中实现上下文。我需要正确设置IDisposable,因为它没有被调用。

public class MyWidgetService : WidgetService, IDisposable
{
    private bool _disposed;
    private readonly DBContext _context;
    public MyWidgetService()
    {
        _context = new DBContext();
    }
    public List GetWidgets()
    {
            return _context.stuff().ToList();
    }
    // however dipose is never being called
    public void Dispose()
    {
        Dispose(true);
    }
    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
                _context.Dispose();
            }
        }
        _disposed = true;
    }
}

然后我使用Ninject为我的小部件服务的实例提供服务

public SomeClass(IWidgetService widgetService)
{         
    _widgetService = widgetService;            
}

我在这里用ninject注册小部件服务

private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            try
            {
                kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
                kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
                kernel.Bind<IWidgtetService>().To<WidgetService>();
                kernel.Bind<IWidgetService>().To<WidgetService>();                
                RegisterServices(kernel);
                return kernel;
            }
            catch
            {
                kernel.Dispose();
                throw;
            }
        }

查看此问题的答案:

Dispose()和Ninject 指南

来自帖子:

一旦GC收集到创建的对象所绑定的作用域对象,Ninject就会处理每个具有InTransientScope以外的另一个作用域的Disposable对象。这就是为什么每个一次性对象都应该绑定一个不是InTransientScope()的范围。例如,您可以使用NamedScope扩展中的InParentScope(),一旦注入对象的对象被垃圾回收,就会立即处理该对象。

您没有在绑定上指定作用域,因此默认情况下它们使用临时作用域。如果您使用任何其他作用域,您应该看到调用了Dispose

最新更新