2

そのため、.NET MVC 3 ベースのアプリケーションを実行し、Castle Windsor を IOC コンテナーとして使用しています。

問題なく使用できており、問題なく動作しています。今、メソッドを公開している HTML ヘルパーを作成したこの状況に遭遇しました

public static string GetContentByKey(string key)
{
     //I need to use a service that is resolved by Windsor here
}

問題は、このヘルパー クラスでは、windsor を介して初期化されたサービスを使用する必要があることですが、このヘルパーは静的メソッドであるため、コンストラクター インジェクションのオプションがありません。

4

1 に答える 1

2

設計上の欠陥がある可能性があるというコメントに同意します。

そうは言っても、それ行う必要がある場合は、いくつかの方法があります。

1) サービス ロケーターを使用します。必要なインターフェイスの実装をメソッド内から解決します。これをアンチパターンと見なす人もいますが、これは少しコードの匂いがします。

2) 初期化できるクラス レベルの静的フィールドを使用します (おそらく null オブジェクトの実装から開始します)。

public static class MyHelper
{
    private static IMyService service = new NullMyService();

    public static void Assign(IMyService instance)
    {
        service = instance;
    }

    public static string DoSomething(this HtmlHelper html)
    {
        return service.Whatever();
    }
}

次に、合成ルート (最近よく使われる用語です) から、assign メソッドを呼び出してサービスを設定します。

...
MyHelper.Assign(container.Resolve<IMyService>());
...

100%快適に感じることはできませんが、望ましい結果が得られます。

于 2012-05-23T14:05:18.730 に答える