2013-08-23 18 views
2

我在MVC 4網站中使用Ninject.Web.WebApi-RC。爲什麼長度爲0的byte []被注入到我的類中?

在我NinjectWebCommon.cs文件我有:

kernel.Bind<IA>().To<A>(); 
kernel.Bind<byte[]>().ToConstant(new byte[1]).WhenTargetHas<AKeyAttribute>(); 

在我的WebAPI控制器我請求在構造函數中的IKernel(只是試圖解決)。我在我的控制器構造函數中調用Get<IA>()。爲A的構造是這樣的:

public A([AKey] byte[] key) 

其中AKeyAttribute是擴展Attribute類。我的問題是,當代碼進入A的構造函數時,它的參數是長度爲0的byte,而不是1.

任何想法?謝謝!

編輯

這是令人難以置信的怪異。我已經改變了構造的A到:

public A([AKey] string test) 

而且我NinjectWebCommon.cs文件到:

kernel.Bind<string>().ToConstant("Test").WhenTargetHas<AKeyAttribute>(); 

然後​​確實被注入到控制器。但是,當我這樣做:

public A([AKey] string[] test) 
kernel.Bind<string[]>().ToConstant(new string[] { "Test" }).WhenTargetHas<AKeyAttribute>(); 

這是行不通的。

我猜你什麼時候在類的構造函數中做一些東西,它期望多注入?有沒有辦法來覆蓋這個?

+1

'Byte'和'string'是不明確的類型。它們通常包含配置值(例如連接字符串,文件路徑等),並且通過註冊本身,您無法說出該值是什麼。防止將此類型或該類型的集合直接註冊到容器中。無論如何,這個'byte []'中有什麼信息? – Steven

+0

我有一個類('B'),需要一個'IA'的實例。我的'IA'實現了一些加密的東西,並且需要一個關鍵字,這個關鍵字會根據這個Web應用程序的部署而變化。我使用連接字符串(一個'byte []''''''''''''''''''作爲注入到'IA'實例的密鑰的散列。無論如何,我不認爲這是像陣列一樣的原始。我認爲Ninject看到了'byte []'並查找了被註冊爲執行多次注入的'byte'。我找到了一些有用的東西,並將其作爲我的答案發布。 –

+1

很好,這可以解決,但是當你得到需要注入的第二個字節數組時,你會做什麼?通過使用委託來註冊類型A(例如'Bind ().ToMethod(c => new A(hash))')或者使用構造函數參數override:'Bind ()來防止出現這種情況。 ().WithConstructorArgument(「hash」,hash)'。如果您需要將此散列注入多個組件,最好將這個散列隱藏在抽象之後(例如'IHashingProvider')。 – Steven

回答

0

這是我最終做的。如果您需要到注入一個恆定的數組構造函數,你可以改變構造一個方式是注入式的Func<>問題如下所示:

byte[] hash = ... 
kernel.Bind<Func<byte[]>>(). 
      ToConstant(new Func<byte[]>(() => hash)). 
      WhenTargetHas<AKeyAttribute>(); 

public A([AKey] Func<byte[]> key) 

(再明顯致電Func<>在構造函數)

相關問題