2014-03-05 132 views
2

是否有可能在F#中使用Ninject進行隱式構造函數注入?如果是這樣,怎麼樣?F#Ninject構造函數注入

我試着將[<Inject>]屬性放在類型定義上,但是我收到了一個錯誤,認爲它是無效的。

這裏是我的嘗試:

[<Inject>] 
type Blah(x : ISword) = 
+2

這應該是可能的 - 你可以編輯你的問題併發布代碼,所以我們可以看到你有什麼。這將幫助人們根據您的需求定製答案。 –

回答

2

Inject屬性是僅限Property setter injection。構造函數注入是隱含的。只需創建綁定,然後使用構造函數注入創建kernel.Get<Blah>()Blah

+1

+1這是正確的。順便說一句(我只是從示例中的ctor中刪除了'[Inject]',在案例**中注意到[Inject]屬性很重要這意味着你的大部分代碼不需要知道Ninject,也不需要引用Ninject命名空間/庫。**有點太TL;人們的DR –

1

這裏的構造函數注入在F#:

type Foo(bar : IBar) = 
    // class members etc. here 

,需要你拍的類型的屬性,以便了解任何圖書館,是做有問題;選另一個圖書館。

+0

+1查看其他評論;雖然Ninject確實允許通過Methods上的屬性來覆蓋默認選擇策略,但絕對不建議或慣用。注意Ninject _ *不需要this_和[文檔](https://github.com/ninject/ninject/wiki/Injection-Patterns)不推薦它 - 事實上,它們走出去的狀態你的實際代碼應該是不要指向容器[並且是容器不可知的]。 (如果你認爲它在任何方式上有誤導性,那麼在這裏進行任何修改都很高興) –

2

該規範允許這樣如下:

class-type-defn := 

    type-name primary-constr-args_opt object-val_opt '=' class class-type-body end 

其中

primary-constr-args := 

    attributes_opt accessopt (simple-pat, ... , simple-pat) 

其結果是,你只需要更改您的代碼

type Blah [<Inject>](x : ISword) = 
+1

+1但是如果你使用Ninject,你絕對不應該這樣做。 Ninject通過'Bind'表達式有很多方法來識別使用的正確構造函數(在不太可能的情況下,它不會僅僅使用默認的構造函數選擇策略來做正確的事情)。 –