2011-01-24 58 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

再次,我需要看到你正在做什麼來真正回答你的問題的例子。

相關問題