我今天开始使用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无法确定要注入的实例,但我知道这是'命名'实例的用途吗?
由于
答案 0 :(得分:0)
当使用Ninject定位同一接口的多个实现时,您需要使用.Named
调用来完成此操作。但是您还需要在构造函数上添加Named
属性,以便Ninject知道要解析的实现。
如下所示:
示例
class SomeClassThatConsumesOneOfYourImplementations
{
public SomeClassThatConsumesOneOfYourImplementations(
[Named("DbGeoContext")] IDataContextAsync context)
{
// Constructor logic...
}
}