1

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() }); 

乾杯、マルク・

答えて

1

は、私の知る限りすべての大きなDIフレームワーク(Autofac、ユニティ、城ウィンザー、のStructureMap、Ninject)は上書きする機能を持っています登録。それらのほとんどは、同じサービスタイプに対して複数の登録を行い、登録のうちの1つをデフォルトのものとして選択します。ただし、どのインスタンスが選択されるかは、フレームワークによって異なります。いくつかのフレームワークは複数の登録のうち最初のものを選択しますが、他のフレームワークは最後の登録を選択します。選択のフレームワークがどのようにこれを行うかを知ることは重要です。なぜなら、これにより、他のすべてのインスタンスの前に 'オーバーライド'インスタンスを登録する必要があるかどうかが決まるからです。

これらのフレームワークはすべて異なるオーバーロードの解像度を持っているため、既定では単純インジェクタにオーバーライド動作がないようにすることにしました。これにより、Simple Injectorの設計目標の1つであった別のフレームワークへの移行が容易になります。しかし、デフォルトでは登録を無効にすることができますが、設定ミスの原因となり、追跡に時間がかかることがあります。Simple Injectorは簡単に開始できるはずであるため、(デフォルトでは)上書きを禁止するのが理にかなっていました。

シンプルインジェクタでは、AllowOverridingRegistrationが有効になっている場合、新しい登録は実際には同じ種類の以前の登録を置き換えます。これは通常、他の登録を保持する他のコンテナとは異なり、これらの登録をすべて単一のコレクションとして解決できるようにします。シンプルインジェクターでは、物のコレクションを別々に登録しなければならず、別々にオーバーライドする必要があります。

シンプルインジェクターと大きなもののほかに、他のすべてのコンテナについては、あまり言い表せません。しかし、私は、オーバーライドはそれらの大部分でやりにくいと思う。

+1

デフォルトのコンテナLightCoreをSimpleInjectorに置き換え、これまでのところ私たちのニーズに応えているようです。 ;) – Marc

+0

この質問を見てください:http://stackoverflow.com/questions/9852407/how-to-write-libraries-without-forcing-users-to-use-the-librarys-ioc-containerエンタープライズライブラリがこれをどのように行うかを見てみましょう。デフォルトではUnityを使用しますが、コンテナを交換することができます。 – Steven

関連する問題