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多类型构造函数

当使用Ninject针对同一接口的多个实现时,您需要像以前一样使用.Named调用。但是,您还需要在构造函数上添加Named属性,以便Ninject知道要解析哪个实现。

如图所示:

https://github.com/ninject/ninject/wiki/Contextual-Binding#simple-约束解析命名绑定

示例

class SomeClassThatConsumesOneOfYourImplementations
{
    public SomeClassThatConsumesOneOfYourImplementations(
        [Named("DbGeoContext")] IDataContextAsync context)
    {
        // Constructor logic...
    }
}