2013-07-31 54 views
0

我有我的通用綁定,和其中一個是這樣的:Ninject WithConstructorArgument不覆蓋類型的全局綁定?

Bind<IHasher>().To<SHA256Hasher>(); 

這個偉大的工程,因爲有其整個使用該散列器幾類。然而,有一個或兩個控制器需要另一種類型的散列器來與第三方一起使用哈希,比如希望有md5散列的gravatar。於是我做了如下:

Bind<ISomeController>().To<SomeController>().Named("SomeController").WithConstructorArgument("emailHasher", new Md5Hasher()); 

然後我的控制器看起來像:

public class SomeController : Controller 
    { 
     private IHasher emailHasher; 

     public CampaignController(IHasher emailHasher) 
     { 
      this.emailHasher = emailHasher; 
     } 
    } 

調試時我期望IHasher是Md5Hasher,但它是一個Sha256Hasher。那麼這是預期的行爲和任何方式使它使用重寫類型?

+0

通常控制通過它們的類型解決,而不是通過某個接口解決,也不需要註冊它們'Named',所以試着註冊:'綁定()。ToSelf()。WithConstructorArgument(「emailHasher 「,new Md5Hasher());' – nemesv

+0

這個問題有一個原因在這個問題的範圍之外,因爲我使用插件樣式的體系結構和控制器是通過名字訪問的,但是我只是想把它放在它之前這可能會影響這個區域的注入過程。所以有一個原因爲什麼有一個具體類型和命名標準的接口。 – Grofit

+1

'WithConstructorArgument'應該按預期工作,所以你的自定義插件樣式體系結構中還有其他的東西會導致你的問題......也許你的控制器註冊沒有按正確的順序調用,你的'WithConstructorArgument'註冊後來被一些默認值覆蓋。 .. – nemesv

回答

1

我想這是一個MVC控制器。 MVC框架將解決SomeController而不是ISomeController。因此,您的綁定不適用,但Ninject將使用隱式綁定SomeControllerToSelf

改爲爲SomeControllerToSelf創建綁定。

+0

實際使用情況對於定製控制器工廠和事情來說更復雜一些,所以它在接口和命名綁定而不是接口上運行,因爲它們都是IController,允許運行時插件在不知道類型的情況下進行掛接。無論如何給你答案,因爲這將是一種解決任何*正常*用例的方法。 – Grofit