6

私は次のオブジェクト構造を持っています

public interface IParser {}
public interface IAction : IParser {}
public interface ICommand : IParser {}

//impl
public class Action1 : IAction {}
public class Command1 : ICommand {}

//registration
container.Register<IAction, Action1>();
container.Register<ICommand, Command1>();

//resolve
var parsersList = container.Resolve<IList<IParser>>() //expected: parsersList.Count=2 actual count=0

DryIOC でこれらの親インターフェイスと子インターフェイスの間で何らかのバインディングを行う方法はありますか?

編集:

私はいくつかの調査を行い、RegisterMany がそのトリックを実行したことを発見しましたが、少し混乱しています。

//registration
//container.Register<IAction, Action1>(); //if I drop these two lines \_____
//container.Register<ICommand, Command1>();                           /     |
container.RegisterMany<Action1>(); // and use these lines                   |
container.RegisterMany<Command1>();                                         |
//resolve                                                                   |
var parsersList = container.Resolve<IList<IParser>>() //WORKS Count = 2     |
container.Resolve<IAction>() //not working Unable to resolve IAction    <---|
container.Resolve<ICommand>() //Same here for ICommand                  <---|
container.Resolve<IParser>() //not working either

上記の個々の登録行のコメントを解除すると、Resolve は IAction と ICommand では機能しますが、IParser では機能しません。

RegisterMany親タイプが正しく登録されていないようです...

編集2:

を使用して、登録を次のように変更しましたRegisterMapping

container.Register<IAction, Action1>();
container.Register<ICommand, Command1>();
container.RegisterMapping<IParsable, ICommand>(); //1st registered mapping
container.RegisterMapping<IParsable, IAction>();
container.Resolve<IList<IParser>>().Count = 1 //instead of 2.

IParsers リストの項目は、最初に登録されたマッピングのタイプです。この場合ICommand

私はDryIOC v2.6.2を使用しています

4

1 に答える 1

3

ここでは、.NET Fiddle でサンプルを作業および説明しています。

コード:

    var container = new Container();

    container.RegisterMany<Action1>();                 
    container.RegisterMany<Command1>();

    var parsersList = container.Resolve<IList<IParser>>();

    // works fine
    container.Resolve<IAction>();

    // works fine
    container.Resolve<ICommand>();

    // Throws because IParser is registered multiple times (as Action and as Command),
    // and container is unable to select one. This is precisely what exception is saying.
    //container.Resolve<IParser>();

この場合、DryIoc の例外があなたを導くはずです。

アップデート:

使用する非公開サービス タイプを含めたい場合RegisterMany:

container.RegisterMany<Action1>(nonPublicServiceTypes: true);                 
container.RegisterMany<Command1>(nonPublicServiceTypes: true);
于 2016-06-22T08:30:17.460 に答える