Ninject多类型构造函数

时间:2015-12-11 13:01:09

标签: c# ninject ninject.web.mvc

我今天开始使用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无法确定要注入的实例,但我知道这是'命名'实例的用途吗?

由于

1 个答案:

答案 0 :(得分:0)

当使用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...
    }
}