Как я могу использовать один и тот же экземпляр наследуемого DbContext в дереве наследования в Ninject? - PullRequest
0 голосов
/ 28 октября 2019

У меня прекрасная проблема в моем решении ...

На объект сущности нельзя ссылаться несколькими экземплярами 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, который наследуется от AnotherDbContext, а затем BaseDbContext. AnotherDbContext не используется нигде, что имеет значение, поэтому мой 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 для всего остального. Это решает хорошо (я получаю правильные ТИПЫ), но случай, который отличается, является нарушителем.

Есть идеи?

1 Ответ

1 голос
/ 28 октября 2019

Чтобы добиться этого, я переписал метод RegisterDatabase следующим образом ...

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

Это возвращает один и тот же экземпляр для всех типов.

...