[解決済み] バスタードインジェクションに代わるものはありますか?(デフォルトコンストラクタを使った貧乏人インジェクションです。)
質問
私は、いくつかのケースで "bastard injection" を使用したくなることがよくあります。 私が "適切な" 依存性注入コンストラクタを持っているとき。
public class ThingMaker {
...
public ThingMaker(IThingSource source){
_source = source;
}
しかし、そうすると、私が意図しているクラスは パブリックAPI (他の開発チームが消費するクラス) のために、最も必要とされる依存関係を持つデフォルトの "bastard" コンストラクタを書くことより良いオプションを見つけることはできません。
public ThingMaker() : this(new DefaultThingSource()) {}
...
}
理想的には、そのような依存関係はなく、コンシューマは常に彼らが望むどんなIThingSourceでもインジェクトすることができることです。 しかし、これではあまりにも使いにくい。コンシューマはThingMakerを立ち上げてThings作りに取り掛かり、数ヶ月後に必要なときに他のものをインジェクトしたいのである。 このため、私の意見では、いくつかのオプションしか残っていません。
- ThingMaker の消費者に、IThingSource を理解し、ThingMaker が IThingSource とどのように相互作用するかを理解し、具象クラスを見つけるか書くかして、コンストラクタ呼び出しでインスタンスを注入するように強制することです。
- ろくでなしのコンストラクターを省略し、別のファクトリー、コンテナー、または他のブートストラップ クラス/メソッドを提供する。何らかの方法で消費者に自分自身の IThingSource を書く必要がないことを理解させ、ThingMaker の消費者にファクトリーまたはブートストラッパーを見つけ理解しそれを使用するように強制します。
- コンストラクターを維持し、コンシューマーがオブジェクトを "new up" して実行できるようにし、DefaultThingSource へのオプションの静的依存に対処する。
少年よ、#3 は確かに魅力的に見えます。 他の、より良いオプションはありますか? #1や2にはその価値がないように思えます。
どのように解決する?
私が理解する限り、この質問は、いくつかの適切なデフォルトで疎結合のAPIを公開する方法に関するものです。この場合、あなたは良い ローカルデフォルト があるかもしれませんが、その場合、依存関係はオプションと見なすことができます。に対処する一つの方法は オプションの依存関係 を扱う一つの方法は プロパティ・インジェクション の代わりに コンストラクタ・インジェクション - 実際、これはプロパティ・インジェクションのためのポスターシナリオのようなものです。
しかし、バスタード・インジェクションの本当の危険性は、デフォルトが 外国のデフォルト である場合です。なぜなら、デフォルトのコンストラクタが、デフォルトを実装するアセンブリに望ましくない結合を引きずることを意味するからです。しかし、私がこの質問を理解するように、意図されたデフォルトは同じアセンブリに由来するものであり、その場合、私は特に危険を見いだすことはありません。
いずれにせよ、私の以前の回答の1つで説明したように、Facadeを考慮することもできます。 依存性注入 (DI) "friendly" ライブラリ
ちなみに、ここで使われている用語は、パターン・ランゲージの 拙著 .
関連
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み] Dependency Injectionのコンストラクタの狂気を回避する方法とは?
-
[解決済み】Spring @Autowire プロパティとコンストラクタの違いについて
-
[解決済み] Dependency InjectionはEncapsulationを犠牲にしなければならないのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み] コンストラクタ内の仮想メンバー呼び出し
-
[解決済み】Dependency Inject (DI)の "フレンドリー "なライブラリ