【问题标题】:Inject DbContext to repository based on the generic type using Simple Injector使用 Simple Injector 基于泛型类型将 DbContext 注入到存储库
【发布时间】:2020-03-16 16:46:10
【问题描述】:

考虑我有以下泛型类:

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 有两个构造函数。

考虑到我已经注入了ContextAContextB,根据其通用参数值为Repository 注入适当的DbContext 的最佳方法是什么?

更新

我想根据传递的类型将DbContext 注入Repository&lt;T&gt;,以初始化Repository&lt;T&gt;

所以我可能有:

IRepository<Entity1> ...

Entity1 可能在 NameSpace.ContextA 中。

【问题讨论】:

    标签: c# entity-framework .net-core simple-injector


    【解决方案1】:

    您需要使用接受RegistrationRegisterConditional 重载。这样您就可以将 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"));
    
    

    【讨论】:

    • 好的,我有一个问题。看来我用来检测存储库通用参数类型的方式是不正确的。因为我收到“为 DbContext 找到多个适用的注册。适用的注册是……”错误。我应该用什么代替“GenericTypeArguments”
    • 请用错误的详细信息(堆栈跟踪等)更新您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    相关资源
    最近更新 更多