質問

IoCコンテナを使い始めたばかりなので、これが愚かな質問である場合はおologiesび申し上げます。

アプリに次のようなコードがあります

internal static class StaticDataHandlerFactory
    {
        public static IStaticDataHandler CreateHandler(StaticDataUpdate staticDataUpdate)
        {
            if (staticDataUpdate.Item is StaticDataUpdateOffice)
            {
                return new OfficeUpdateHandler();
            }

            if (staticDataUpdate.Item is StaticDataUpdateEmployee)
            {
                return new EmployeeUpdateHandler();   
            }

            if (staticDataUpdate.Item == null)
            {
                throw new NotImplementedException(
                    string.Format("No static data provided"));
            }
            else
            {
                throw new NotImplementedException(
                    string.Format("Unimplemented static data type of {0}", staticDataUpdate.Item.GetType().FullName));
            }
        }
    }

基本的には、入力データを処理するための正しい戦略を返す単純なファクトリーです。

IoCコンテナを使用すると、このようなコードを削除できますか?つまり、入力パラメータのタイプに基づいてロードする具体的な実装を動的に選択できますか?

または、ここからコースを離れますか?

役に立ちましたか?

解決

実際には、コードの一部を制御システムの反転に置き換えることは可能ですが、それは良い考えだと私には明らかではありません。依存性注入は、オブジェクトの動的な作成ではなく、システムの構成に最適です。別の言い方をすれば、コンテナ自体は巨大なグローバル変数なので、コードの大部分に表示されるはずです。

余談ですが、コードはデメテルの法則。パラメータは" StaticDataUpdateItem"型である必要があります。 " StaticDataUpdate"ではなく。これを観察すると、StaticDataUpdateItemのメソッド呼び出しとしてこのコードを書き換えるという非常に強力な議論があります。

IoCを非常に頻繁に使用しましたが、抽象オブジェクトパターンを使用した動的オブジェクト作成の方が依然として適切に処理されます。要するに、ハンドルを生成するためにメソッドをアイテム自体に追加するというアイデアが気に入らない場合、おそらくコードはそのままにしておくのが最善です。

他のヒント

あなたはまったく遠くない。私が理解しているように、あなたはかなり近いです。

この種の最も一般的な構造は、返されるUpdateHandlersをDependency Injectionを使用して指定できるようにすることで、FactoryクラスをIoCコンテナーに変換することです。したがって、コードにStaticDataUpdateOfficeがOfficeUpdateHandlerを返すことを指定するロジックを持たせる代わりに、StaticDataUpdateOfficeが(新しく指定された) m_officeUpdateHandler 変数に含まれるものを返すという単純なコードに変えることができます。ファクトリを呼び出す前に、フレームワークが m_officeUpdateHandler の値を設定していることを確認していれば、準備完了です。また、必要に応じて m_officeUpdateHandler の値を実行時に必要なものに変更できます。

この依存性注入により、制御の反転プロセスを制御できます。ハンドラーを返す単純なファクトリーを作成し、必要に応じて、どのハンドラーが別の場所に返されるかを制御するロジックを抽象化できます。

注:この種のことに関する私の経験は、Springでの(非常に前向きな)経験に強く依存しているため、あなたの質問(および答え)の解釈に影響を与える可能性があります。

簡単な答えはイエスです。許可されています。このブログ投稿はWindsorを使用して実行時に実装を選択する洗練された方法。著者のAyendeは、ここおよびこちら

私はまだこれを試していませんが、すぐに期待しています。

ここでの他の答えに同意します。そう、あなたはそうすることができます。しかし、なぜジェネリックを使用しないのですか?

public static IStaticDataHandler CreateHandler<T>( params object[] args )
{...

ここで、argsは(たとえば、Activatorに)ctor引数として渡すことができます。

あまり意味のある言葉はまだ読んでいません。

IoCは設定用ですか?

動的オブジェクトの作成は何が良いですか?ジェネリック?これはすべて話題外です。

1)IoCは、「特殊化/継承よりも優れた構成」の福音を実装する場合に比べて、時間を節約できる素晴らしいものです。

したがって、IoCを使用するためのルール#1は、「実装ではなくバインドするバインド」に従う長いコンストラクターを処理することに本当に疲れるはずです。

別の言い方をすれば、これは同じ理由でテンプレートパターンに対する代替としてのストラテジーパターンです(カプセル化...)...しかし、すべての追加のインターフェイス/抽象型を作成するのはもっと手間です。すべてのIServiceProvicerThisとIResolverThatで毎回それを実行するように働きます。次のようなコード契約を退屈に遂行することに飽き飽きしていない場合:

IInterestingService興味深い= ...ただし、インスタンスを取得します。

このようにさらに3行追加します。

then

IAmazementService service = new AmazementService(興味深い、thesecondstrategy、thethirdなど)

それは古くなっています。したがって、IoCは決して疑問ではありません。なぜなら、堅実なデザインを使用してコードを作成するのに十分賢い人なら誰でも知っているからです。質問する人はすべて間違った答えを持っています。

したがって、実際に上記の条件を満たす場合は、絶対に。 IoCコンテナは、あなたがそれらを処理させることから利益を得ることができる限り多くの「創造的な」仕事をするためにフックにあります。そして、明示的な新規よりも最も一般的な創造的抽象化は、ミスター・ファクトリーです。

デイモン

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top