ベストプラクティスの短い質問:オブジェクトAが別のオブジェクトBに注入されている場合、オブジェクトBはオブジェクトBを実装し、Bを配置するとAを処分する必要がありますか?注入された特性は処分する必要がありますか?
答えて
私は一般的にノーと言います。依存性注入の性質は、注入されたオブジェクトが注入されたもののライフサイクルをあまり知らないことを意味します。これはある程度注射の定義です。そういうわけで、私は注入されたオブジェクトが注射されたものを処分するとは思わない。注入コードは注入している全てのオブジェクトの完全なライフサイクルを知る責任を負うべきであり、それらに対するすべての操作が完了したときであっても、以前からではなく、それらを適切に処分できなければならない。
私はそれが本当に主観的になると思います。
これは、すべてのオブジェクトAの寿命を制御する必要があります誰に煮詰めるでしょうか?インスタンスオブジェクトCとDのため
言っても、オブジェクトAは、その場合には、あなたがオブジェクトBが途中でオブジェクトAを廃棄たくない、彼らの中に注入しています。
しかし、あなたはBで終了する必要がオブジェクトAの寿命を知っているいくつかのケースでは、あなたがdependency injectionパターンを参照している場合はオブジェクトA
のオブジェクトBの処分を持つように完全に適切である、IオブジェクトAの実装についてのオブジェクトBの知識に依存すると考えてください。このような依存性注入を行う理由は、通常、オブジェクトAの実装方法とIDisposableの必要性を事前に知らないためです。あなたが知っているのはインターフェイスだけです。
この動作を追加すると、2つのクラスIMO間の結合がより緊密になります。
(編集:応答するとき、それは質問がのIoC/DI程度であったことを私に明らかwan't;私は参考のためにここにこれを残しておきますが、受け入れ答えで最初に見て)。よる場合
あなたはB
がA
の所有権を前提としていることを意味し、「注入された」、[はい。この例はStreamReader
のようなものになります。その後、
それだけしばらくA
を使用しています(ただし、A
がB
を超えて生き続けて)場合はありません。
一部のAPIを使用すると、所有権が想定されるべきかどうか(コンストラクタで)指定することができ(すなわち、注入されたオブジェクトをクリーンアップするかどうか)。この例はGZipStream
です。
私の2pは、Bが処分されたときにAを処分してはならないと主張することです。依存性注入のアイデアの全体は、あなたが受け取っているオブジェクトのバハウィアとライフサイクルを心配する必要はなく、ただ手渡されているだけです。
は、その後、再び、あなたはそれがもはや必要とされていないように、オブジェクトは、すぐにクリーンアップされますようにしたいです。あなたがそれを処分する必要があることを通知できるようにミニイベントシステムを作成するかもしれませんか?私はそれが本当にコンテキストに依存すると思う。
- 1. モノタック:ビューを処分する必要がありますか?
- 2. 例外が処理された後にブレークする必要があります
- 3. Request.CreateResponse()からHttpResponseExceptionを処分する必要がありますか?
- 4. MVCビューにサービスを注入する必要がありますか?
- 5. ターゲットディレクトリには何を入れる必要がありますか?
- 6. 請求モジュールを自分のクラスライブラリに入れる必要がありますか?
- 7. SSL_read()はSSL_ERROR_WANT_WRITEを処理する必要がありますか?
- 8. angularjsのコントローラに$ scopeを注入する必要はありますか?
- 9. SqlDataReaderを手動で閉じて処分する必要がありますか?
- 10. CRM OrganizationServiceProxyとOrganizationServiceContextの両方を処分する必要がありますか?
- 11. なぜhtml_safeに注意する必要がありますか?
- 12. CSLAを依存性注入フレームワークで使用する必要がありますか?
- 13. 依存性注入:いくつかのオブジェクトにすべてを注入するか、サービスロケータを使用する必要がありますか?
- 14. AngularJSで使用するには、必ず$ locationを注入する必要がありますか?
- 15. オブジェクトを処分する必要があるときは、どうすればわかりますか?
- 16. 使用後にDbCommandを処分する必要はありますか?
- 17. EJB、RMI、クラスタリングが処理を分散する必要があります
- 18. パスワードフィールドにスペースを入れる必要がありますか?
- 19. カスタムNSURLProtocolはリダイレクトされる必要がありますか、またはクライアントがそれを心配する必要がありますか?
- 20. ロジックがトリガアクションまたはエントリに入る必要がありますか?
- 21. ユーザー設定の依存性注入パラメータはありますか?
- 22. アクティビティまたはビューにコードを挿入する必要がありますか?
- 23. テーブルを縦に分割する必要がありますか?
- 24. ファイルを分散キャッシュで使用するにはHDFSに入れる必要がありますか?
- 25. ボックスに入力された言語の文字またはテキストを検出する必要があります
- 26. Googleスプレッドシートを特定の場所に挿入する必要があります
- 27. Scalaの特性に混在させる新しいオブジェクトを作成する必要がありますか?
- 28. 処分する前にコントロールが親オブジェクトから適切に削除する必要がありますか?
- 29. AutoMapper 4.2/5.0に移行する際、IMapperインスタンスまたはMapperConfigurationインスタンスを依存性注入コンテナに格納する必要がありますか?
- 30. UIスレッドでマーシャリングされたメソッドはスレッドセーフである必要があります
この場合、オブジェクトAはそれを使用するクラスの前に処理されないように、何らかの参照カウントを必要とします。 –