【发布时间】: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