如何在 Ninject 中跨继承树使用继承的 DbContext 的相同实例?

How can I use the same Instance of an inherited DbContext across the inheritance tree in Ninject?

我的解决方案中有一个可爱的问题...

An entity object cannot be referenced by multiple instances of IEntityChangeTracker

这是因为 UserManager 实现和基本上其余代码似乎使用了 DbContext.

的不同实例

我遇到的问题是 UserManager 在继承树中使用了 DbContext 的较低级别版本(大约有 4 级继承 DbContext - 这是一个巨大的大量的遗留代码,所以现在改变它不是我的选择)。

这是 UserManager...

public class MyUserManager : UserManager<User, int>
{
    private readonly BaseDbContext db;

    public MyUserManager(BaseDbContext dbContext) 
        : base(new UserStore<User, Role, int, UserLogin, UserRole, UserClaim>(dbContext))
    {
        db = dbContext;
        var provider = new DpapiDataProtectionProvider("My");

        UserValidator = new UserValidator<User, int>(this) { AllowOnlyAlphanumericUserNames = false };
        UserTokenProvider = new DataProtectorTokenProvider<User, int>(provider.Create("MyTokenProvider"));
    }
}

其他一切都使用一个名为 MainDbContext 的 class,它继承自 AnotherDbContext,然后是 BaseDbContextAnotherDbContext 没有在任何重要的地方使用,所以我的 Ninject 设置如下...

private static IKernel RegisterDatabase(this IKernel kernel)
{
    kernel.Bind<BaseDbContext>().To<MainDbContext>().InRequestScope();
    kernel.Bind<MainDbContext>().ToSelf().InRequestScope();
    return kernel;
}

(我对所有 IoC 设置都使用了流畅的方法,因此在主设置中调用了该方法)。

我认为这会做我想做的事情(全面使用 MainDbContext 实例解析)但它没有 - 我似乎为 UserManager 获得了 1 个实例,为其他所有内容获得了 1 个实例。它解决得很好(我得到了正确的类型)但是实例不同是一个破坏者。

有什么想法吗?

为了实现这一点,我重写了 RegisterDatabase 方法如下...

private static IKernel RegisterDatabase(this IKernel kernel)
{
    kernel.Bind<BaseDbContext, OtherDbContext, MainDbContext>()
        .To<MainDbContext>().InRequestScope();
    return kernel;
}

这returns所有类型的相同实例。