1

LightCoreをデフォルトのサービスロケーターとしてMetadata-/ORM-Frameworkに統合しようとしています。したがって、フレームワーク内からいくつかのデフォルトの登録を行い、フレームワークユーザー(=アプリケーション開発者)が自分の実装で何らかの形で「却下」できるようにします(これを行うのが好きな場合)。これは、LightCore IoCコンテナーまたは他のIoCコンテナーでどのように行う必要がありますか?

私たちが試したこと:

var builder = new ContainerBuilder();
builder.Register<Foo>().ControlledBy<SingletonLifecycle>();
builder.Register<Foo, Foo2>().ControlledBy<SingletonLifecycle>();

var container = builder.Build();

var foo = container.Resolve<Foo>();

Fooの契約として2つのクラスを登録しました。上記のコードでは、常に最初の(Fooのインスタンス)が返されます。したがって、ここでの支配はありません。ところで:Foo2のインスタンスを取得したいと思います。

具象クラスの使用からインターフェースの使用に変更しました。

var builder = new ContainerBuilder();
builder.Register<IFoo, Foo>().ControlledBy<SingletonLifecycle>();
builder.Register<IFoo, Foo2>().ControlledBy<SingletonLifecycle>();

var container = builder.Build();

var foo = container.Resolve<IFoo>();

これを実行すると、Resolve <>()でresolve例外が発生し、登録が見つからなかったことが通知されます。2番目の「Register()」ステートメントを削除すると、Fooのインスタンスを取得する方法で機能します。

いくつかの一般的な概念を見逃したかどうかはわかりません。これは他のIoCでも同じように機能しますか?登録を無効にする/上書きするための推奨される方法は何ですか?

このトピックに関するヘルプは、LightCoreだけでなく素晴らしいものです。

更新: SimpleInjector IoCコンテナーを使用して、上記のシナリオのいくつかのテストを設定しました。このコンテナーでは、コンストラクターでAllowOverridingRegistration = trueを指定する必要があり、期待どおりに機能します。したがって、LightCoreはこのユースケースを正しくサポートしていないように見えますが、他のユースケースはサポートしています。

更新: LightCoreの作成者から、LigtCoreは登録のオーバーライドをまったくサポートしていないという迅速な回答がありました。したがって、これらのシナリオの登録をLightCoreでオーバーライドする方法はないように思われるため、LightCoreからSimpleInjectorに切り替えました。

次のSimpleInjector構成は、現在の4つの要件に一致します。

  // Register concrete class for FooFoo
  container.RegisterSingle<FooFoo>();

  // Register concrete classes for Foo - Final registration should return FooFoo, not Foo
  container.RegisterSingle<Foo>();
  container.RegisterSingle<Foo, FooFoo>();

  // Register interfaces for IFoo - Final registration should return FooFoo, not Foo
  container.RegisterSingle<IFoo, Foo>();
  container.RegisterSingle<IFoo, FooFoo>();

  // Register list of Plugs
  container.RegisterAll(new IPlug[] { new PlugA(), new PlugB() });

乾杯、マーク

4

1 に答える 1

1

すべての大きなDIフレームワーク(Autofac、Unity、Castle Windsor、StructureMap、Ninject)には、登録をオーバーライドする機能があります。それらのほとんどは、同じサービスタイプに対して複数の登録を行うことでこれを許可し、デフォルトの登録として登録の1つを選択します。ただし、どのインスタンスを選択するかは、フレームワークごとに異なります。複数の登録から最初の登録を選択するフレームワークもあれば、最後の登録を選択するフレームワークもあります。選択したフレームワークがこれをどのように行うかを知ることは重要です。これにより、「オーバーライドする」インスタンスを他のすべての前に登録するか、後に登録するかが決まるためです。

これらのフレームワークはすべて異なるオーバーロード解決策を持っているため、Simple Injectorにデフォルトでオーバーライド動作を持たせないことにしました(すでにお気づきのように、構成可能ですが)。これにより、SimpleInjectorの設計目標の1つである別のフレームワークへの移行が容易になります。ただし、デフォルトで登録をオーバーライドできるようにすることは、構成ミスの原因になる可能性もあり、追跡に時間がかかる可能性があります。Simple Injectorは簡単に始められるはずなので、オーバーライドを禁止するのは理にかなっています(デフォルト)。

Simple InjectorをAllowOverridingRegistration有効にすると、新しい登録が同じタイプの以前の登録に実際に置き換わります。これは、通常は他の登録を保持し、それらすべての登録を単一のコレクションとして解決できる他のコンテナーとは異なります。Simple Injectorでは、物のコレクションを個別に登録する必要があり、個別にオーバーライドできます。

SimpleInjector以外のすべてのコンテナと大きなコンテナについてはあまり言えません。ただし、ほとんどの場合、オーバーライドは難しいと思います。

于 2012-03-27T07:09:53.703 に答える