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() });
乾杯、マーク