依存性注入フレームワークは依存性リスクを引き起こしますか?


13

依存性注入を使用するように既存のシステムをリファクタリングしており、その作業は順調に進んでいます。

しばらくして、社内ライブラリの多くが、使用しているDIフレームワークに依存するようになったことに気付きました。その結果、プロジェクト全体がこのサードパーティフレームワークに依存するようになりました。

共有ライブラリに依存させることで、すべての依存関係を分離することに皮肉を感じました。

私の最初の反応は、依存関係フレームワークのラッパーライブラリを作成することでした。したがって、必要に応じてこのフレームワークを置き換えることができます。関連する作業を推定した後、結果のAPIは既存のフレームワークに似ているため、置き換えがより困難になることに気付きました。だから私はその考えを捨てました。

私の懸念は、使用しているDIフレームワークが時代遅れになるか、交換する必要があることです。

DIを操作するときに、プロジェクトとDIフレームワーク間の結合を減らす開発パターンがありますか?


4
「DIフレームワークを使用しない」パターン。あなたが本当に持っていない問題を解決しているのか疑問に思う必要があります-DIフレームワークを変更する可能性はどのくらいですか?
オデッド

1
@Oded優れたDIフレームワークは、コードを透過的に操作できるはずですが、それが不可能な場合もあります。その後、クラス内でDI APIを使用する必要があります。これらの場合、それらのクラスを変更することなくDIフレームワークを共有または変更することは困難です。DIフレームワークを使用するのはこれが初めてなので、交換する必要があるかどうかはわかりません。
Reactgular 14年

8
システムも電気に依存しています。最初にそれを分離することをお勧めします。
イダンアリー

3
@MathewFoscariniこれはアンチパターンではありませんか?あなたはそれを行うことができますが、依存関係を難読化してはいけません。
maaartinus 14年

2
@MathewFoscarini DIFramework.Get<IService>()は実際には依存性注入ではありません。これは、Service Locatorと呼ばれる関連パターンです。多くの人がService Locatorを嫌っています。なぜなら、それはあなたをフレームワークに結びつけ、それがあまりにも簡単に悪用されるからです(シングルトンのように)。マーティンファウラーには、これらのパターンに関する素晴らしい記事があります。martinfowler.com
ベンジャミンホジソン

回答:


8

あなたは完全に正しいです-DIフレームワークを使用すると、おそらくそのコードに依存するコードになります。実際、これは他のすべてのフレームワークまたは基盤ライブラリに当てはまるため、特にそのlibがコードのどこでも使用されるいくつかの汎用機能でプロジェクトをサポートする場合に当てはまるため、これは驚くべきことです。たとえば、特定のUIフレームワークまたはWebフレームワークを使用することを決定した場合、そのライブラリに基づいて特定の量のコードをビルドするとすぐに、この決定を変更することは困難です。特定の(非標準の)Stringクラスを使用することにした場合、その決定を後で簡単に変更することはできません。このような決定はアーキテクチャ上の決定であり、特定のプログラミング言語を選択して、100K行を超えるコードを記述した後にその決定を変更しようとするようなものです。

すべてのコードが特定のフレームワークに依存していることは、期待どおりに機能し、適切に維持されている限り、問題にならない可能性があります。しかし、そうでない場合は問題になる可能性があります。その状況に対処する方法がいくつかあります。

  • 数年前からアップデートや新しいリリースを提供できると信じているベンダーからフレームワークを選択する

  • ベンダーが市場から姿を消したことを考えると、十分な数のコード行(および適切なライセンス)を備えたオープンソースフレームワークを選択してください。

  • 独自のフレームワークを書く

  • ベンダーが利用可能である限り状況に耐え、彼が本当に姿を消したとき、別のフレームワークを選択し、新しいフレームワークを使用して古いフレームワークをエミュレートするアダプターを作成しようとします

事前にラッパーライブラリを作成するというアイデアはまったく新しいものではありませんが、動作することはほとんどありません。 「新しい」フレームワークは次のようになります。一方、数年前、上記のアダプター戦略を適用することにより、C ++プロジェクトの完全なUIフレームワークを約120K行のコードと正常に交換しました。


19

通常のコンストラクター注入では、フレームワークはまったく必要ありません。失うのは、依存関係を構成ファイルに集中化する機能だけです。

DIコンテナは、「エンタープライズソフトウェア」パターンであり、オブジェクトグラフが非常に大きく複雑な場合に使用されます。私は、アプリケーションの95%がそれを必要としないと思います。


5
小規模なプロジェクトでは必要ありません、プロジェクトの95%以上が利益を上げることができることに同意します。
maaartinus 14年

11
@maaartinus:最小限の利益のために不必要に複雑さを追加しました。
ロバートハーヴェイ14年

1
なに?これらはクラスごとの統計です:0.5注釈、0.1構成行。それで、あなたはどのような複雑さを意味しますか???
maaartinus 14年

2
@RobertHarvey:上記の声明には100%同意しますが、OPは彼がすでにDIフレームワークを導入していると述べています。彼に「もっと良い」と言うのは、彼の質問に対する答えではありません。
Doc Brown 14年

1
@maaartinusは、フレームワークが自動化され、より多くのものを挿入できるほど、複雑になります。XML構成ファイル、コンストラクターインジェクション、プロパティインジェクション、自動オブジェクトモック、遅延インジェクションなどがあります。これらのDIフレームワークは非常に複雑になる可能性があります。
Reactgular

0

私は、DIフレームワークがすぐに本当に時代遅れになるとは思わない。廃止するにはどうすればよいですか?

  • 新しい、よりスマートなパターンの発明でしょうか?どのように見えても、コードを大幅に変更する必要があります。
  • 多分言語の変更?さらに悪い。

私は、現在のDIが十分に成熟しており、そこに多くのことが起こっていることに気付いていないと思います。言語を指定していないため、Guiceと言えば、かなり目立たず、標準のJavaアノテーションで動作します(標準化されていないものにも独自のアノテーションを使用しますが、ほとんど必要ありません)。オープンソースで広く使用されており、Apacheがライセンスされています。何が問題なのでしょうか?

DIフレームワークの変更は、他のライブラリを変更するよりも桁違いに簡単であると確信しています(たとえば、UIの変更はより多くの作業を意味します)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.