将 Ninject 处理在其接口上没有 IDisposable 但在其实现上有 IDisposable 的对象?

Will Ninject Dispose of an Object that doesn't have IDisposable on it's Interface, but does on it's implementation?

假设我有一个用于实现 IDisposable 的对象的接口,例如我用于 Entity Framework DbContext 的这个接口:

public interface IMyContext : IDisposable
{
    DbSet<TEntity> Set<TEntity>() where TEntity : class;
    DbSet Set(Type entityType);
    int SaveChanges();
    IEnumerable<DbEntityValidationResult> GetValidationErrors();
    DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity:class;
    DbEntityEntry Entry(object entity);
}

如果我要删除此 接口 IDisposable 的声明,如下所示:

public interface IMyContext // : IDisposable -- Commented out IDisposable
{
    DbSet<TEntity> Set<TEntity>() where TEntity : class;
    DbSet Set(Type entityType);
    int SaveChanges();
    IEnumerable<DbEntityValidationResult> GetValidationErrors();
    DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity:class;
    DbEntityEntry Entry(object entity);
}

如果我使用此接口解析它,Ninject 是否仍然能够处理我的 DbContext?

IE:是否 Ninject 检查正在解析的对象以检测 IDisposable,即使它在界面上丢失?

这就是您可以自己验证的方法:

public interface IFoo { }

public class Foo : IDisposable
{
    public void Dispose() 
    {
        Console.WriteLine("got disposed");
    }
}

var kernel = new StandardKernel();
kernel.Bind<IFoo>().To<Foo>().InSingletonScope();
kernel.Get<IFoo>();
kernel.Dispose();

如果你能看到 "got disposed" .. 好吧.. 它被处理掉了.. 如果没有.. 它没有! 当然,您可以随意用静态布尔标志替换 Console.WriteLine