1

私たちはDIコンテナとしてウィンザー城を使用してきましたが、代替品を探しています。Simple Injectorにたどり着きました。これまでのところ、そのシンプルさに感銘を受けましたが、現在立ち往生しているシナリオの1つは、一部のコンポーネントにレイトバウンドインスタンス化を使用している場合です。

私の最初の質問は、それも可能ですか?

ウィンザーでは、このように行われます。

Container.Register(Component.For<ILogger>()
    .UsingFactoryMethod(
        (kernel, componentModel, context) => new Logger(
            context.Handler.ComponentModel.Implementation.Name));

Simple Injectorで同じことをする方法はありますか?

4

1 に答える 1

2

Simple Injector を使用すると、次のいずれかを行うだけで済みます。

  1. Funcデリゲートを明示的に登録するRegister<Func<A, B, C>>((a, b) => { ... })
  2. などのインターフェースを作成しILoggerFactory、実装を作成して登録します。

アップデート

あなたの質問をもう一度読み、キャッスルの定義を調べたところ、UsingFactoryMethodあなたの質問を誤解しているという結論に達しました。あなたが探しているのは、その親タイプに基づいてインスタンスを作成することです: Context Based Injection

これは、Simple Injector のドキュメント wiki で例として示されているContext Based Injection Extension メソッドを実装することで実現できます。

この拡張メソッドをプロジェクトに追加すると、次のように同等の登録を行うことができます。

container.RegisterWithContext<ILogger>(context =>
{
    return new Logger(context.ImplementationType.Name);
});
于 2012-12-03T19:06:17.573 に答える