首页 > 解决方案 > 如何在 Ninject 的继承树中使用继承的 DbContext 的相同实例?

问题描述

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

一个实体对象不能被多个 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,它继承自AnotherDbContextthen BaseDbContextAnotherDbContext没有在任何重要的地方使用,所以我的 Ninject 设置如下......

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

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

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

有任何想法吗?

标签: c#asp.net-mvcentity-frameworkninject

解决方案


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

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

这将为所有类型返回相同的实例。


推荐阅读