在Autofac中,可以在注册服务时指定TypedParameter,该服务给出将传递给服务构造函数的特定值或委托。在解析/实例化期间,将通过类型发现构造函数上的实际参数。
在Ninject中,我只能找到对命名参数的支持(即,提前知道.ctor参数的实际名称)。否则,Ninject将发现未指定的构造函数参数,并尝试通过检查容器来解析所需的任何类型。
但是,这对我的需求来说还不够具体,因为我需要将多个相同类型的实例传递给不同服务实例的构造函数。
我想给Ninject一个特定的工厂委托或值作为构造函数参数,只给出一个类型作为限定符,而不是参数名称。我也不希望通过使用任何属性修饰构造函数参数来依赖Ninject。
这可能吗?非常感谢提前!
答案 0 :(得分:6)
我认为你想要的是条件绑定。最普遍的是:
Bind<IFoo>().To<Foo>().When(request => SomeFancyFilter(); }
我不知道什么最适合你,因为你没有真正指定你真正想要实现的目标。但我想其中一个应该适用:
Bind<IFoo>().To<Foo1>().WhenInjectedInto<Class1>()
Bind<IFoo>().To<Foo2>().WhenInjectedInto<Class2>()
或者: 创建自己的属性,例如Bar1,Bar2并将它们添加到构造函数中:
public Class1([Bar1]IFoo foo)
public Class2([Bar2]IFoo foo)
public Class3([Bar2]IFoo foo)
Bind<IFoo>().To<Foo1>().WhenTargetHas<Bar1Attribute>()
Bind<IFoo>().To<Foo2>().WhenTargetHas<Bar2Attribute>()
答案 1 :(得分:0)
我不明白你的问题100%。你能举例说明你想做什么吗?这看起来可能符合您的需求:
https://github.com/ninject/ninject/wiki/Multi-injection
如果没有,我觉得你需要制作一个像这个例子的工厂方法:
public override void Load()
{
Func<Ninject.Activation.IContext, IMyInterface> factoryFunc =
(context) => {
return new ConcreteFactory(...parameters...);
};
Bind<IMyInterface>().ToMethod(factoryFunc);
}
在factoryFunc的方法中,您可以检查上下文(这是绑定上下文)以返回所需的工厂方法。具体来说,您可以检查context.Request.Service
或context.Request.Target
。
同样,我需要看一个你正在做的事情的例子来真正回答你的问题。