Metadata-/ORM-FrameworkのデフォルトサービスロケータとしてLightCoreを統合しようとしています。したがって、Framework-User(=アプリケーション開発者)が何らかの形で自身の実装を「却下する」(フレームワークユーザが、これを何かしたいと思うのであれば)、フレームワーク内のいくつかのデフォルト登録をしたいと思っています。 LightCore IoCコンテナまたは他のIoCコンテナでこれをどのように行うべきですか?LightCore ServiceLocator同じ契約に複数登録されています
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のインスタンス)が返されます。だからここでは誇張しない。 Btw: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>();
を所定の位置に私たちが解決<で解決exceptionnを取得>()は登録が見つかりませんでしたことを伝えます。 2番目の "Register()"ステートメントを削除すると、Fooのインスタンスを取得する方法で機能します。
いくつかの一般的な概念が欠落しているかどうかはわかりません。これは他のIoCと同じように機能しますか?登録を覆す/上書きするための推奨される方法は何ですか?
このトピックについての助言は、LightCoreだけでなく素晴らしいものです。
更新: SimpleInjector IoCコンテナを使用して、上記のシナリオでいくつかのテストを設定しました。このコンテナでは、コンストラクタでAllowOverridingRegistration = trueを指定する必要があり、期待どおりに動作します。だから、LightCoreはこのユースケースを正しくサポートしていないようですが、他のものはそうしているようです。
更新: 我々はLigtCoreはまったく上書き登録をサポートしていないことを言ってLightCoreクリエイターからの高速応答を得ました。そこで、これらのシナリオの登録を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() });
乾杯、マルク・
デフォルトのコンテナLightCoreをSimpleInjectorに置き換え、これまでのところ私たちのニーズに応えているようです。 ;) – Marc
この質問を見てください:http://stackoverflow.com/questions/9852407/how-to-write-libraries-without-forcing-users-to-use-the-librarys-ioc-containerエンタープライズライブラリがこれをどのように行うかを見てみましょう。デフォルトではUnityを使用しますが、コンテナを交換することができます。 – Steven