Simple Injector注册双参数泛型Repository提示泛型参数数量不匹配如何解决
报错原因
你注册服务时使用的IClownRepository<>是单泛型参数的接口定义,而对应的实现类ClownRepository<,>是双泛型参数定义,二者泛型参数数量不匹配。DI容器无法自动填充实现类中缺失的TDBContext泛型参数,因此抛出该异常。
解决方案
你可以根据项目使用的DbContext数量选择对应方案:
方案1:单DbContext场景(最常用)
如果你的项目仅使用一个派生自ClownDbContext的上下文类,直接新增一层单泛型参数的适配实现类即可:
public class ClownRepository<T> : ClownRepository<ClownDbContext, T> where T : Entity<int> { public ClownRepository(ClownDbContext context) : base(context) { } }
之后直接用原有的注册逻辑即可正常运行:
services.AddTransient(typeof(IClownRepository<>), typeof(ClownRepository<>));
方案2:多DbContext场景
如果你的项目需要支持多个不同的ClownDbContext派生类,需要先把所有用到的DbContext都注册到容器中,再按上下文分类注册对应仓储即可:
// 先注册所有用到的DbContext services.AddDbContext<FirstDbContext>(options => /* 对应上下文的配置项 */); services.AddDbContext<SecondDbContext>(options => /* 对应上下文的配置项 */); // 按上下文分类注册对应仓储,使用时根据业务场景显式注入对应实现 services.AddTransient(typeof(IClownRepository<>), typeof(ClownRepository<FirstDbContext,>)); services.AddTransient(typeof(IClownRepository<>), typeof(ClownRepository<SecondDbContext,>));
如果要在运行时动态选择DbContext,也可以通过工厂模式封装仓储的创建逻辑,避免泛型参数不匹配的问题。
内容的提问来源于stack exchange,提问作者advapi
相关产品推荐
相关产品推荐

