Unity注册报错:同时设置MappedToType与InjectionFactory不被支持的求助
解决Unity注册DbContext时“同时设置MappedToType和InjectionFactory不被支持”的问题
嘿,这个问题我之前用Unity 4.x版本时也碰到过,原因其实挺清晰的:当你用RegisterType<DbContext, MyDBContext>这种泛型注册写法时,已经明确告诉Unity要把DbContext映射到MyDBContext类型(也就是设置了MappedToType),这时候再传入InjectionFactory就会产生冲突——Unity搞不清楚该用哪个逻辑创建实例:是直接实例化MyDBContext,还是调用你提供的工厂方法?
下面给你两种可行的解决方案:
方案一:直接注册DbContext类型,用工厂方法提供实例
既然你的CreateDBContext()已经返回了MyDbContext实例(它本身就是DbContext的子类),那完全不需要再指定映射类型,直接注册DbContext即可:
container.RegisterType<DbContext>(new PerRequestLifetimeManager(), new InjectionFactory(x => CreateDBContext())); private static MyDbContext CreateDBContext() { MyDbContext dbContext = new MyDbContext(); // 这里补充你的DbContext初始化逻辑,比如配置连接字符串、启用懒加载等 return dbContext; }
这样Unity会通过你提供的工厂方法创建MyDbContext实例,并将其作为DbContext类型的服务返回,完美避开冲突。
方案二:先注册MyDbContext,再映射DbContext到它
如果你的代码里有很多地方直接依赖MyDbContext,可以先注册这个具体类型,再把DbContext映射到已注册的MyDbContext上:
// 先注册具体的MyDbContext,绑定生命周期和工厂方法 container.RegisterType<MyDbContext>(new PerRequestLifetimeManager(), new InjectionFactory(x => CreateDBContext())); // 再将DbContext类型映射到已注册的MyDbContext实例 container.RegisterType<DbContext>(new PerRequestLifetimeManager(), new InjectionFactory(x => x.Resolve<MyDbContext>()));
这种方式既满足了直接依赖MyDbContext的场景,也能让依赖DbContext的地方正常解析到实例。
额外提醒
记得把CreateDBContext()方法补全,比如确保MyDbContext的连接字符串配置正确,避免后续出现数据库连接相关的问题。
内容的提问来源于stack exchange,提问作者LP13
相关产品推荐
相关产品推荐

