15

Autofac にはモジュールがあり、Windsor にはインストーラーと StructureMap Registries があります。Simple Injector を使用すると、構成ロジックを再利用可能なクラスにどのようにパックできますか?

私が試してみました:

public interface IModule { }

public class FooModule : IModule
{
    public FooModule(SimpleInjector.Container container)
    {
        container.RegisterSingleton<IBar, Bar>();
        container.RegisterSingleton<IFoo, Foo>();
    }
}

そして、私はコンポジションルートでそれを使用します:

public static void Main(string[] args)
{
    var container = new SimpleInjector.Container();
    container.RegisterCollection<IModule>(new FooModule(container));
    ...
}

ただし、FooModuleコンテナーに依存し、おそらく良い方法ではありません... http://code.google.com/p/autofac/wiki/BestPracticesを参照してください:

コンポーネントがコンテナーに依存している場合は、コンテナーを使用してサービスを取得する方法を確認し、代わりにそれらのサービスをコンポーネントの (依存関係が挿入された) コンストラクター引数に追加します。

4

1 に答える 1

18

「モジュール」機能は意図的に Simple Injector コア ライブラリから除外されていますが、これを可能にするSimpleInjector.Packaging NuGet パッケージがあります。「パッケージ」は、Simple Injector が使用する用語です。ただし、このライブラリは、1 つのIPackageインターフェイスと 2 つの拡張メソッドにすぎません。次のようなコードを記述して、同じことを実現できます。

パッケージ:

public static class BootstrapperPackage
{
    public static void RegisterServices(Container container)
    {
        container.Register<IBar, Bar>(Lifestyle.Scoped);
        container.Register<IFoo, Foo>(Lifestyle.Singleton);            
    }
}

コンポジションルートで:

public static void Main(string[] args)
{
    var container = new SimpleInjector.Container();

    BootstrapperPackage.RegisterServices(container);

    ...
}

SimpleInjector.Packaging NuGet パッケージとの違いは、このパッケージがインターフェイスを定義し、1 行で複数のパッケージを動的にロードできることです。

public class BusinessLayerPackage : IPackage
{
    public void RegisterServices(Container container)
    {
        container.Register<IBar, Bar>(Lifestyle.Scoped);
        container.Register<IFoo, Foo>(Lifestyle.Singleton);            
    }
}

public static void Main(string[] args)
{
    var container = new SimpleInjector.Container();

    container.RegisterPackages(AppDomain.CurrentDomain.GetAssemblies());
}

ただし、動的な読み込みが本当に必要ない場合は、次の利点があるため、(上記のように) 静的メソッドを使用することをお勧めします。

  • モジュールのロードを非常に明示的で見つけやすくします。
  • ロードするモジュールとロードしないモジュールを簡単に選択できます。
  • RegisterServicesそのようなモジュールが必要とする構成値など、追加の値をメソッドに簡単に渡すことができます。これにより、モジュールが構成システムに強く依存することを防ぎます。

詳細については、こちらをお読みください

于 2012-01-24T09:09:43.360 に答える