我有两个支持相同接口的对象。每个对象都有自己的配置对象,该配置对象作为构造函数参数传递。我希望Ninject使用对象的名称来解析其配置参数。当前,如果我执行kernel.Get(“ one”),即使该名称恰好注册了一个,它也无法解析ThingConfig。 (编辑:修正了包含ThingConfig绑定的示例):
class MyService
{
public MyService([Named("one")] IThing one, [Named("two")] IThing two) {}
}
class ThingConfig {}
class Thing(ThingConfig cfg) : IThing {}
And in my binder:
Bind<IThing>().To(typeof(Thing)).InSingletonScope().Named("one");
Bind<IThing>().To(typeof(Thing)).InSingletonScope().Named("two");
Bind<ThingConfig>().ToMethod(() => new ThingConfig()).InSingletonScope().Named("one");
Bind<ThingConfig>().ToMethod(() => new ThingConfig()).InSingletonScope().Named("two");
答案 0 :(得分:0)
我认为我找到了涉及Named和WhenAnyAncestorNamed的可接受解决方案。
我实质上希望有一个“标签”来标识范围,因此该名称符合要求。我希望能够按名称解析对象,或者将其注入由该名称激活的对象中。为此,我必须将对象绑定两次-一次按名称绑定,一次对任何具有该名称的祖先进行绑定:
Bind(interfaces.ToArray()).To(objectType).InSingletonScope().Named(name);
Bind(interfaces.ToArray()).ToMethod(
ctx => ctx.Kernel.Get(ctx.Request.Service, name)).WhenAnyAncestorNamed(name);
如果有人知道一个更优雅的解决方案,我将为您服务。