DI / IOCのctorパラメーターをどのように注文すればよいですか?
-
03-07-2019 - |
質問
私は少しDI初心者なので、これが間違ったアプローチであるか愚かな質問であるかどうかは許してください。
注文を作成/更新するフォームがあり、表示する製品と顧客のリストを取得する必要があると思います。編集中のOrderオブジェクトを渡したいが、依存関係としてProductsServiceとCustomersServiceを注入したい。
したがって、IoCコンテナー(どちらを使用する場合でも)にサービスを提供する必要がありますが、編集するOrderオブジェクトを提供するのは呼び出しコード次第です
最初のパラメーターとしてOrderオブジェクトを、その後にProductsServiceとCustomersServiceを使用するようにコンストラクターを宣言する必要があります。例:
public OrderForm(Order order, ProductsService prodsSvc, CustomersService custsSvc)
...または、依存関係が最初になり、Orderオブジェクトが最後に来る必要があります。例:
public OrderForm(ProductsService prodsSvc, CustomersService custsSvc, Order order)
重要ですか?使用するIoCコンテナに依存しますか?または、「良い」がありますか?方法?
解決
@akuの答えに同意しません。
あなたがしていることはうまくいくと思うし、それをやる他の方法も多かれ少なかれ正しいと思う。例えば、このオブジェクトがそもそもサービスに依存するべきかどうか疑問に思うかもしれません。
DIに関係なく、実際の状態(順序)、派生状態(存在する場合)、依存関係(サービス)など、少なくとも各オブジェクトが保持する状態の種類を心に明確にすると役立つと思います:
http://tech.puredanger.com/2007/09/18/スペルチェック/
コンストラクタまたはメソッドでは、実際のデータを最初に渡し、依存関係または外部のものを最後に渡すことを好みます。したがって、あなたの例では、最初のものを好むでしょう。
他のヒント
マット、通常のパラメーターと依存関係を混在させないでください。オブジェクトはIoCコンテナの内部で作成されるため、必要な引数をどのように指定しますか?
依存関係と通常の引数を混合すると、プログラムのロジックがより複雑になります。
この場合、依存関係プロパティを宣言する(つまり、コンストラクターから依存関係を削除する)か、IoCが OrderForm を構築して依存関係を解決した後に order フィールドを初期化する(つまり、削除するコンストラクターからの通常のパラメーター)。
また、順序を含むすべてのパラメータを依存関係として宣言できます。
Orderインスタンスへの参照を必要とせずに、OrderFormのインスタンスをインスタンス化できるようにすることに少し不安を感じます。理由の1つは、これにより、null注文の事前チェックを行えなくなることです。他に考えはありますか?
OrderFormオブジェクトは、IoCフレームワークの呼び出し後にOrderプロパティが設定されることを保証するFactoryメソッドによってのみインスタンス化されることを知って安心できると思います。