c# - 如何在 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
,它继承自AnotherDbContext
then 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 个其他所有实例。它解决得很好(我得到了正确的类型),但不同的实例是一个破坏者。
有任何想法吗?
解决方案
为了实现这一点,我重写了RegisterDatabase
方法如下......
private static IKernel RegisterDatabase(this IKernel kernel)
{
kernel.Bind<BaseDbContext, OtherDbContext, MainDbContext>()
.To<MainDbContext>().InRequestScope();
return kernel;
}
这将为所有类型返回相同的实例。
推荐阅读
- php - Prge_replace 在 php 中无法正常工作
- c++ - 在 C++ 中,函数返回自定义数据结构的向量会引发分段错误
- ethereum - ethereum/web3JS 特定用例:从单个私钥管理多个地址/交易
- c++ - C++ 打开文件对话框不显示 OpenCv 库
- jquery - 必需属性不适用于使用远程数据初始化的 select2 插件
- c++ - c++冒泡排序或线性排序,令人困惑的书
- html - HTML - 使用 display: inline 时如何将文本放在另一行文本下或以其他方式
- python - 优化代码以处理大量数据
- xamarin - 如何制作接受颜色字符串的模板绑定?
- uwp - IFrameworkView IFrameworkViewSource 和 OnPointerPressed 是什么关系