我正在按照下面的代码在我的服务中实现上下文。我需要正确设置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
。