2016-06-30 8 views
1

DIを管理するDIコンテナとDIコンテナについて少しお読みください。DIコンテナと具体的な値/構成データ

基本的に、依存関係のあるクラスを作成し、コンストラクタまたはセッタメソッドを使用して注入する方法を提供します。次に、DIコンテナに、どのような具象クラスを使用してすべてを配線するかを指示します。最後に、何らかのサービスロケータを呼び出します。これは、すべての依存関係を解決し、コードの1行だけで複雑なオブジェクトを提供します。

コンクリートDIコンテナの実装は一度も使用していないので、DIコンテナがどのように最下位レベルのオブジェクトを処理するのか不思議です。これらのオブジェクトは、コンクリート(コード化)値または構成ファイルの内容を使用して構成する必要があります。例えばこれを持っ:

class FooDao { 
    public FooDao(DBConnection db) {...} 
} 

class ConcreteDBConnection : DBConnection { 
    public ConcreteDBConnection(String url, int port, String user, String pw) 
    {...} 
} 

あなたはConcreteDBConnectionオブジェクトを使用してFooDaoオブジェクトをインスタンス化することを、(注釈、XMLファイル、または何か他のものを使用して)あなたのDIコンテナを言うだろう。しかし、データベース接続に必要な具体的な値をDIコンテナにどのように伝えていますか?具体的な値を最初に計算する必要がある場合(たとえば、ローカルに格納されたデータベース接続情報を暗号化するなど)

これは非常に一般的な質問ですが、私がDI容器について読んだ記事も非常に一般的であり、この点は本当に私を混乱させました。どのように任意の人気のDIフレームワークがこれを行うかについての簡単な説明は私の質問に答えるのに十分でしょう。

+2

[Dependency-injection anti-pattern:コンポーネントへのランタイムデータの挿入](https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99&month=11&year=2015)と[なぜ我々は抽象的な工場のデザインパターンが必要ですか?](http://stackoverflow.com/q/2280170/181087) – NightOwl888

答えて

1

一般的なDIコンテナの使い方を尋ねる場合は、Castle Windsorの使用に関する記事がたくさんあります(http://ardalis.com/getting-started-with-castle-windsorなど)。他のDIフレームワークを試してみると、そのコンセプトはよく知られています。城ウィンザーは本当に良いです - それは始めるのに最適な場所です。

あなたはどのようにDIコンテナ作業求めている場合 - それは長い議論だが、基本は以下のとおりです。 1.あなたのフレームワークを使用して、いくつかの種類のコンテナを作成します。通常は簡単ですvar container = new Container(); 1.コンテナに具体的なクラスへのインタフェース( "サービス")のマッピングを登録します。いくつかのフレームワークには、最も一般的な要件のように、あなたのためにこれを行うにはいくつかの魔法があります:インターフェイスIFooと1つの解像度Fooクラスしかない場合、自動的に登録されます(iirc、Autofacはこれを行いますか? ) 2.インタフェースを解決するようコンテナに依頼します。インタフェースはクラスにマップされます。解決の間、コンテナは、提供された具象クラスのコンストラクタを検査し、その型に基づいてパラメータを解決しようと試みます。同様に、タイプと既知の登録に基づいてプロパティを設定できます。

+0

私は具体的な値をどのように注入するかを尋ねています。インターフェイスの具象クラスを登録することはかなり簡単ですが、Diのコンテナについて読むすべての記事では、依存関係のない「リーフクラス」になります。あなたがオブジェクト階層全体に注入する必要がある多くの構成データを持っているので、少し奇妙であることがわかりました。 –

+1

多くの場所に注入する設定データがある場合、通常はコンストラクタ経由で注入できる 'IApplicationConfig'のようなインタフェースがあります。その具体的な実装は手動で登録することができます(例えば、Windsorはシングルトン登録を行うことができます)。また、DictionaryAdapterでトリックを実行してapp.configから設定を取得することもできます。 – daf

+0

登録は一時的である必要はなく、スレッド、http要求、またはアプリケーションのライフタイムにライフサイクルが依存する可能性があることに注意してください。 – daf

関連する問題