0

クラスIoC<TContainer>TContainer含むモジュールで使用する IoC コンテナーをラップするクラスです。次のように実装されます。

public class IoC<TContainer>
    where TContainer : IServiceLocator
{
    public static TContainer Container { get; set; }

    public static T Resolve<T>()
    {
        return Container.Resolve<T>();
    }
    public static object Resolve(Type type)
    {
        return Container.Resolve(type);
    }
    public static IEnumerable<T> ResolveAll<T>()
    {
        return Container.ResolveAll<T>();
    }
    public static IEnumerable ResolveAll(Type type)
    {
        return Container.ResolveAll(type);
    }
}

現在、このように初期化する必要がある場所

IoC<StructureMapServiceLocator>.Container = ...

使い方を簡単にするために、次のようなクラスを定義しようとしました。

public class SMIoC : IoC<StructureMapServiceLocator>
{
    private SMIoC()
    {}

    static SMIoC()
    {
        Container = ... // Initialization
    }
}

ただし、これは機能せず (前の質問)、これは悪い設計であることが示唆されました。初期化を自動化するにはどうすればよいですか (静的コンストラクターを使用するか、他の方法を使用して)、または他のトリックを使用できますか?

4

1 に答える 1

0

通常、アプリケーションまたはサービスの初期化中にアプリケーションでそれを行います。

  • ASP.NET . Global.asaxApplication_Startイベントまたはカスタム HTTP モジュール。
  • ウェブ API . ASP.NET と同じです。
  • Windowsフォーム/WPF/Silverlight......Main()
  • ...

私は静的コンストラクターに依存しません。コンテナーがリクエストまたはスレッドに割り当てられていることを確認する必要がある場合は、各プラットフォームがメソッドのオーバーライド、イベント、またはフレームワークの初期化中に実行されるものを提供するため、上記で説明した方法をお勧めします(現時点では単一のスレッドが動作します)。コンテナをインスタンス化し、それを何らかの静的プロパティに設定する一方で、他のスレッドは初期化が終了するまでブロックされます) .

最後に、コントロール コンテナーの反転を静的プロパティに設定する、プラットフォームに依存しない汎用的な安全な方法はありません。物事が正しく行われていることを確認するために、ヒントを取ってください! :)

于 2012-10-18T13:36:17.170 に答える