【问题标题】:Ninject Multiple Type ConstructorNinject 多类型构造函数
【发布时间】:2015-12-11 13:01:08
【问题描述】:

我今天开始使用 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 = kernel.Get("UnitOfWorkGeoContext"); var t2 = kernel.Get("UnitOfWorkEspContext");

谁能帮我弄清楚这里发生了什么以及如何解决它?

我知道在运行时 Ninject 无法确定要注入哪个实例,但我认为这就是“命名”实例的用途?

谢谢

【问题讨论】:

  • 构造函数必须有Named属性
  • 嗨,这不是重复的,因为我试图在 RegisterService 方法中实现所有绑定逻辑。我不想将 ninject 库包含到我的存储库层中。
  • 答案还是一样,因为你使用的是.Named("SomeUniqueString")——你必须在构造函数中有Named属性,这样它才能知道如何解析。

标签: c# ninject ninject.web.mvc


【解决方案1】:

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

如下图:

https://github.com/ninject/ninject/wiki/Contextual-Binding#simple-constrained-resolution-named-bindings

示例

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    相关资源
    最近更新 更多