Ninject多类型构造函数
本文关键字:构造函数 多类型 Ninject | 更新日期: 2023-09-27 18:26:23
我今天开始使用Ninject,因为Structuremap让我很失望。
当我开始用相同的接口注册相同的类型时,我遇到了一个问题,但我已经命名了它们(如下所示)。
kernel.Bind<IDataContextAsync>().To<DbGeoContext>().InRequestScope().Named("DbGeoContext");
kernel.Bind<IDataContextAsync>().To<DbEspContext>().InRequestScope().Named("DbEspContext");
IParameter geoUnitOfWorkDbContext = new ConstructorArgument("dataContext", kernel.Get<IDataContextAsync>("DbGeoContext"));
IParameter espUnitOfWorkDbContext = new ConstructorArgument("dataContext", kernel.Get<IDataContextAsync>("DbEspContext"));
kernel.Bind<IUnitOfWorkAsync>().To<UnitOfWork>().Named("UnitOfWorkGeoContext").WithConstructorArgument(geoUnitOfWorkDbContext);
kernel.Bind<IUnitOfWorkAsync>().To<UnitOfWork>().Named("UnitOfWorkEspContext").WithConstructorArgument(espUnitOfWorkDbContext);
**Fails here with: Error activating IDataContextAsync
有多个匹配绑定可用。**
var t1=内核。Get("UnitOfWorkGeoContext");var t2=内核。Get("UnitOfWorkEspContext");
有人能帮我弄清楚这里发生了什么以及如何解决吗?
我知道在运行时,Ninject无法确定要注入哪个实例,但我认为这就是"命名"实例的用途?
感谢
当使用Ninject针对同一接口的多个实现时,您需要像以前一样使用.Named
调用。但是,您还需要在构造函数上添加Named
属性,以便Ninject知道要解析哪个实现。
如图所示:
https://github.com/ninject/ninject/wiki/Contextual-Binding#simple-约束解析命名绑定
示例
class SomeClassThatConsumesOneOfYourImplementations
{
public SomeClassThatConsumesOneOfYourImplementations(
[Named("DbGeoContext")] IDataContextAsync context)
{
// Constructor logic...
}
}