2011-01-24 78 views
1

在Autofac中,可以在服务注册时指定一个TypedParameter,该服务提供一个特定的值或委托,该委派将传递给该服务的构造函数。构造函数上的实际参数将在解析/实例化过程中按类型发现。Ninject是否具有Autofac的TypedParameter或ResolvedParameter的等效项?

在Ninject中,我只能找到对命名参数的支持(即提前知道.ctor参数的实际名称)。否则Ninject会发现未指定的构造函数参数并尝试通过检查容器来解决任何需要的类型。

但是,这并不足以满足我的需求,因为我有多个相同类型的实例,需要将它们传递到不同服务实例的构造函数中。

我想为Ninject提供一个特定的工厂委托或构造函数参数的值,只给出一个类型作为限定符而不是参数名称。我也不想通过使用任何属性修饰构造函数参数来使Ninject具有依赖性。

这可能吗?提前谢谢了!

+0

次要一点 - 如果Ninject有一个Autofac ResolvedParameter的等效(即提供我自己的代表告诉Ninject的一些方式,如果该参数我的滤波器参数发现期间相匹配)这也将适合我的需求。谢谢! – 2011-01-24 04:02:55

回答

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>() 
+0

非常好!我在哪里可以找到这些文件? (Ninject在文档方面似乎一般都很少!) – anon 2011-01-25 06:07:45

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.Servicecontext.Request.Target

再次,我需要看到你正在做什么来真正回答你的问题的例子。