如何在 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
,然后是 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 实例解析)但它没有 - 我似乎为 UserManager
获得了 1 个实例,为其他所有内容获得了 1 个实例。它解决得很好(我得到了正确的类型)但是实例不同是一个破坏者。
有什么想法吗?
为了实现这一点,我重写了 RegisterDatabase
方法如下...
private static IKernel RegisterDatabase(this IKernel kernel)
{
kernel.Bind<BaseDbContext, OtherDbContext, MainDbContext>()
.To<MainDbContext>().InRequestScope();
return kernel;
}
这returns所有类型的相同实例。
我的解决方案中有一个可爱的问题...
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
,然后是 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 实例解析)但它没有 - 我似乎为 UserManager
获得了 1 个实例,为其他所有内容获得了 1 个实例。它解决得很好(我得到了正确的类型)但是实例不同是一个破坏者。
有什么想法吗?
为了实现这一点,我重写了 RegisterDatabase
方法如下...
private static IKernel RegisterDatabase(this IKernel kernel)
{
kernel.Bind<BaseDbContext, OtherDbContext, MainDbContext>()
.To<MainDbContext>().InRequestScope();
return kernel;
}
这returns所有类型的相同实例。