10

一般的に、私はアプリケーションが IoC コンテナーを完全に認識しないようにしたいと考えています。ただし、アクセスする必要がある場所で問題が発生しました。痛みを抽象化するために、基本的なシングルトンを使用します。丘に向かって走ったりショットガンを取り出したりする前に、解決策を説明させてください。基本的に、IoC シングルトンはまったく何もせず、渡さなければならない内部インターフェイスに委譲するだけです。これにより、シングルトンの操作が楽になることがわかりました。

以下は IoC ラッパーです。

public static class IoC
    {
        private static IDependencyResolver inner;

        public static void InitWith(IDependencyResolver container)
        {
            inner = container;
        }

        /// <exception cref="InvalidOperationException">Container has not been initialized.   Please supply an instance if IWindsorContainer.</exception>
        public static T Resolve<T>()
        {
            if ( inner == null)
                throw new InvalidOperationException("Container has not been initialized.  Please supply an instance if IWindsorContainer.");

            return inner.Resolve<T>();
        }

        public static T[] ResolveAll<T>()
        {
            return inner.ResolveAll<T>();
        }
    }

IDependencyResolver:

public interface IDependencyResolver
    {
        T Resolve<T>();
        T[] ResolveAll<T>();
    }

キャッスル、スタブ、フェイク、等

これは滑りやすい道ですか?今後、潜在的な問題に遭遇することはありますか?

4

4 に答える 4

4

Ayende でさえこのパターンを Rhino Commons コードに実装しているのを見てきましたが、可能な限り使用しないことをお勧めします。ウィンザー城にデフォルトでこのコードがないのには理由があります。StructureMap はありますが、Jeremy Miller はそれから遠ざかっています。理想的には、コンテナー自体をグローバル変数と同じくらい疑う必要があります。

ただし、別の方法として、コンテナーへの参照として IDependencyResolver を解決するように常にコンテナーを構成することもできます。これはクレイジーに聞こえるかもしれませんが、はるかに柔軟です。オブジェクトは「new」を呼び出すか、処理を実行する必要がありますが、両方を実行する必要はないという経験則を覚えておいてください。「call new」を「resolve a reference」に置き換えます。

于 2008-11-13T10:01:04.000 に答える
3

それは実際にはシングルトン クラスではありません。これは、静的メンバーを持つ静的クラスです。はい、それは良いアプローチのようです。

JP Boodhoo にはこのパターンの名前もあると思います。静的ゲートウェイ パターン

于 2008-11-10T10:34:08.350 に答える
2

注: Microsoft Patterns and Practices は、主要な IoC コンテナーのほとんどが近い将来実装する共通サービス ロケーター ( http://www.codeplex.com/CommonServiceLocator ) を作成しました。IDependencyResolver の代わりに使用を開始できます。

ところで:これは問題を解決する一般的な方法であり、非常にうまく機能します。

于 2008-11-11T00:25:14.740 に答える
1

それはすべて使用法に依存します。このようなコンテナーの使用は、Service Locator パターンと呼ばれます。合わない場合と当てはまる場合があります。

「サービス ロケーター パターン」をグーグルで検索すると、それがアンチ パターンであると言っている多くのブログ投稿が表示されますが、そうではありません。このパターンは単純に乱用 (/乱用) されています。

一般的な基幹業務アプリケーションでは、依存関係を隠すため、SL を使用しないでください。また、別の問題もあります。ルート コンテナーを使用すると、状態/ライフタイムを管理できません (そのライフタイムの代わりに)。

サービス ロケーターは、インフラストラクチャに関しては適切です。たとえば、ASP.NET MVC は Service Locator を使用して、各コントローラーのすべての依存関係を解決できるようにします。

于 2013-06-28T09:49:42.333 に答える