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>();
這是行不通的。
我猜你什麼時候在類的構造函數中做一些東西,它期望多注入?有沒有辦法來覆蓋這個?
'Byte'和'string'是不明確的類型。它們通常包含配置值(例如連接字符串,文件路徑等),並且通過註冊本身,您無法說出該值是什麼。防止將此類型或該類型的集合直接註冊到容器中。無論如何,這個'byte []'中有什麼信息? – Steven
我有一個類('B'),需要一個'IA'的實例。我的'IA'實現了一些加密的東西,並且需要一個關鍵字,這個關鍵字會根據這個Web應用程序的部署而變化。我使用連接字符串(一個'byte []''''''''''''''''''作爲注入到'IA'實例的密鑰的散列。無論如何,我不認爲這是像陣列一樣的原始。我認爲Ninject看到了'byte []'並查找了被註冊爲執行多次注入的'byte'。我找到了一些有用的東西,並將其作爲我的答案發布。 –
很好,這可以解決,但是當你得到需要注入的第二個字節數組時,你會做什麼?通過使用委託來註冊類型A(例如'Bind().ToMethod(c => new A(hash))')或者使用構造函數參數override:'Bind ()來防止出現這種情況。 ().WithConstructorArgument(「hash」,hash)'。如果您需要將此散列注入多個組件,最好將這個散列隱藏在抽象之後(例如'IHashingProvider')。 –
Steven