c# - 使用 Simple Injector 基于泛型类型将 DbContext 注入存储库
问题描述
考虑我有以下通用类:
public class Repository<T> : IRepository<T> where T : class
{
private DbContext Context { get; set; }
public Repository(DbContext context)
{
Context = context;
}
}
我使用 SimpleInjector 注册了两个不同的 dbcontext 如下:
container.Register<ContextA>(
()=> new ContextA(SqlServerDbContextOptionsExtensions.UseSqlServer(
new DbContextOptionsBuilder(), sqlConnection).Options));
container.Register<ContextB>(
() => new ContextB(SqlServerDbContextOptionsExtensions.UseSqlServer(
new DbContextOptionsBuilder(), sqlConnection).Options));
然后我对 dbContext 进行了以下注册:
container.RegisterConditional(
typeof(DbContext),
typeof(ContextA),
c=> c.Consumer.ImplementationType.GenericTypeArguments
.Any(r => r.Namespace == "NameSpace.ContextA"));
container.RegisterConditional(
typeof(DbContext),
typeof(ContextB),
c => c.Consumer.ImplementationType.GenericTypeArguments
.Any(r => r.Namespace == "NameSpace.ContextB"));
当代码到达container.RegisterConditional时,它会抛出错误并抱怨ContextA
有两个构造函数。
考虑到我已经注入了ContextA
and ,根据其通用参数值ContextB
注入的最佳方法是什么?DbContext
Repository
更新
我想注入DbContext
到Repository<T>
,基于传递给初始化的类型Repository<T>
。
所以我可能有:
IRepository<Entity1> ...
这Entity1
可能在NameSpace.ContextA中。
解决方案
您需要使用RegisterConditional
接受 a 的重载Registration
。这样,您可以将 lambda 表达式包装在Registration
如下所示的内部:
var contextARegistration =
Lifestyle.Scoped.CreateRegistration(
() => new ContextA(
SqlServerDbContextOptionsExtensions.UseSqlServer(
new DbContextOptionsBuilder(), sqlConnection).Options),
container);
container.RegisterConditional(
typeof(DbContext),
contextARegistration,
c => c.Consumer.ImplementationType.GenericTypeArguments
.Any(r => r.Namespace == "NameSpace.ContextA"));
var contextBRegistration =
Lifestyle.Scoped.CreateRegistration(
() => new ContextB(
SqlServerDbContextOptionsExtensions.UseSqlServer(
new DbContextOptionsBuilder(), sqlConnection).Options),
container);
container.RegisterConditional(
typeof(DbContext),
contextBRegistration,
c => c.Consumer.ImplementationType.GenericTypeArguments
.Any(r => r.Namespace == "NameSpace.ContextB"));
推荐阅读
- django - 保存时在 Django 模型上引用未保存的字段
- high-availability - 内部 create-md' 以退出代码 20 终止 - DRBD
- python - 使用 gpu 找到好的哈希值
- typescript - 使用 Typescript 和 Jest 进行本机测试
- shell - 在 PBS 作业脚本中使用自定义参数
- php - 使用php(yii2)将图像从本地计算机上传到cloudinary服务器
- powershell - Powershell:从 New-Item 输出完整错误消息的正确方法是什么?
- r - 通过 R 中其他 2 列的所有组合计算列的平均值
- unity3d - 当我使用 SteamVR_LoadLevel 加载新场景时,所有控制器都冻结
- java - Grails 应用程序未启动