C# 使用Ninject处理或不处理可注入实例
我有以下代码块用于在解决方案中配置Ninject:C# 使用Ninject处理或不处理可注入实例,c#,dispose,idisposable,disposable,C#,Dispose,Idisposable,Disposable,我有以下代码块用于在解决方案中配置Ninject: public class NinjectDependencyScope : IDependencyScope { private IResolutionRoot resolver; internal NinjectDependencyScope(IResolutionRoot resolver) { Contract.Assert(resolver != null
public class NinjectDependencyScope : IDependencyScope
{
private IResolutionRoot resolver;
internal NinjectDependencyScope(IResolutionRoot resolver)
{
Contract.Assert(resolver != null);
this.resolver = resolver;
}
public object GetService(Type serviceType)
{
if (resolver == null)
{
throw new ObjectDisposedException("this", "This scope has already been disposed");
}
return resolver.TryGet(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
if (resolver == null)
{
throw new ObjectDisposedException("this", "This scope has already been disposed");
}
return resolver.GetAll(serviceType);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
IDisposable disposable = resolver as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
resolver = null;
}
}
我知道Autofac就是这样。您不必担心如何处理已从Autofac解析的类,因为它将为您调用dispose。我很确定Ninject也会类似。我对Ninject的经验是,当涉及到实现IDisposable的托管对象时,您不必太担心,因为它们最终会被处理掉 但是,如果您有一次性对象,这些对象是围绕非托管对象的包装器,例如围绕Office Interop应用程序对象的C类,那么您需要更加小心,因为这些对象最终将由Ninject处理,但您无法确定何时处理 有时,您需要快速清理这些资源,因为代码的其他部分可能依赖于已清理的这些资源。例如,您可能正在“使用”其中一个对象来创建工作簿,然后不久需要重命名工作簿,此时您需要释放应用程序对象 在这种情况下,我可能会违反DI原则,在使用对象时只是更新它,然后自己处理它
我想您可以自己测试所有这些,这样您就知道哪些对象适合与Ninject一起使用,哪些不适合,并相应地进行测试。如果该类或从其派生的类都不使用非托管资源,则以下模拟实现是正确的-这种情况很少发生:
public void Dispose() {
IDisposable disposable = resolver as IDisposable;
if (disposable != null) {
disposable.Dispose();
}
resolver = null;
}
有关详细信息,请参阅
它是可选的,因为解析程序将被正确地处理掉,即只有在您特别需要控制自己释放由解析程序what?管理的资源时才需要
public void Dispose() {
IDisposable disposable = resolver as IDisposable;
if (disposable != null) {
disposable.Dispose();
}
resolver = null;
}