NinjectのようなものでWebApiを使用するとき、F#でDIを処理する方法を頭に入れようとしています。例えばFを使用しているときに、Api Controllerの新しいメソッドごとにDIコンテナに触れないようにする方法#
、C#で、私は私のコンテナを配線するとき、私は単純に、たとえば、タイプがに解決何DIを言うだろう:コントローラのコンストラクタで必要とされるとき
kernel.Bind<ISomeInterface>().To<SomeClass>();
私のAPIコントローラがこれを自動的に配線します。
偉大な今、私はコンテナに再び触れることなく、一日中、クラス&クラスにメソッドを追加できます。
しかし、私はこれを完全に間違っていない限り、部分的なアプリケーションを作成し、コントローラに渡します。メソッドを追加するたびに、コンテナで再度ワイヤリングする必要があります。たぶんこれは正しいですが、私は確信はありませんが、より多くの配線のように思えます。
私が何を意味するかを明確にするために、代表的なREST APIを使用しましょう。 CRUDを持つ各エンティティについて -
カスタマー(作成、読み取り、更新、削除)
私は各機能をコントローラに注入する必要がありますか?
:私はそれをバインドするとき、私は、のような何かをするだろう、私のコンテナで今let createCustomerFunc = createCustomerDomainFunc createCustomerRepoFunc
let getAllCustomersFunc = getAllCustomerDomainFunc getAllCustomerRepoFunc
let updateCustomerFunc cust = [...]
let deleteCustomerFunc id = [...]
let getSingleCustomerFunc id = [...]
: - >ドメイン - >レポモデル
したがって、この例では、私はサービスを持っていることを言うことができます
kernel.Bind<CustomerController>().To<CustomerController>()
.WithConstructorArgument(createCustomerFunc, getAllCustomerFunc, etc...)
|> ignore
ここでメソッドを追加すると:GetActiveCustomers次に、新しい部分アプリケーションを渡すために上のコードを変更する必要がありますか?
これは間違っていると感じます - 私はこれに間違って近づいていますか?
DIコンテナの遅延バインディングに関する問題点があります。いずれにしても最初は厄介だと感じましたが、V1を完成させた後ではなく、今はあまりインターフェースがなく、純粋な機能性を持っています。そして最後に面倒さが少なくなりました:-) – schmoopy
その話( "Look No Mocks" 'imp'関数そのものをテストしたことはありませんでした。そうした場合、その関数は(どのように配線したいかによって)3つまたは4つの別のパラメータで終了してしまいます。これは非常に簡単な玩具の例です。最終的には、このような「ルート」関数は、元の質問が実際に行っていたものである、膨大なパラメータ(ツリーの下のすべての依存関係の推移的閉包)で終わります。 –
@FyodorSoikin DIコンテナを使用してC#で上記のようなことをやっていたのですが、同様に単体テストを強く感じることはありませんでした。私の[Outside-In Test-Driven Development](http://bit.ly/outside-in-tdd)Pluralsightコースには、その多くのサンプル(C#)があり、デザインを変更するものではありません。この結論はF#についても当てはまる。ロンドンの* Progressive F#Tutorials 2014 *で、私は上記のimp関数のためにF#で書かれた同じ種類の統合テストを示しましたが、何も変更されませんでした。 –