0

ファクトリから引数を渡したい次のようなコンストラクタがあります。

public Event(IRegisteredType registeredEarly, IPassNow passNowByInterface,
                               DateTimeOffset local, DateTimeOffset world)
{
    // ...
}

私はこのアプローチを試みましたが、うまくいきませんでした。ローカル値とワールド値の両方が同じで、一方が他方を上書きしたためです。

public Event CreateEvent(IPassNow passNow, DateTimeOffset local, DateTimeOffset world)
{
    var args = new Arguments { { typeof(IPassNow), passNow } };
    args.InsertTypedCollection(new object[] { local, world });
    return _container.Resolve<Event>(args);
}
4

3 に答える 3

2

Resolveメソッドにはいくつかのオーバーロードがあります。Argumentsタイプは単純でIDictionaryあるため、キーを同じにすることはできません。

そのコンストラクターを使用して のインスタンスを作成しようとするとArguments、「System.ArgumentException」が発生します (同じキーを持つ項目が既に追加されています)。

var args = new Arguments(new object[] {passNow, local, world});

コードをデバッグすると、ディクショナリに 2 つの項目しかないことがわかります。

var args = new Arguments {{typeof (IPassNow), passNow}};
args.InsertTypedCollection(new object[] {local, world});

機能させるために、引数を anonimus 型として渡すことができます。

container.Resolve<Event>(new {passNow = passNow, local = local, world = world});

それを証明するテストがあります

[Fact]
public void ArgumentsAsAnonimusType()
{
    // Arrange.
    var container = new WindsorContainer();
    container.Register(Component.For<Event>().ImplementedBy<Event>());
    container.Register(Component.For<IRegisteredType>().ImplementedBy<RegisteredType>());
    var passNow = new PassNow();
    var local = DateTimeOffset.Now;
    var world = DateTimeOffset.UtcNow;
    local.Should().NotBe(world);

    // Act.
    var result = container.Resolve<Event>(new { passNow = passNow, local = local, world = world });

    // Assert.
    result.Should().BeOfType<Event>();
    result.RegisteredType.Should().Be(container.Resolve<IRegisteredType>());
    result.PassNow.Should().Be(passNow);
    result.Local.Should().Be(local);
    result.World.Should().Be(world);
}
于 2014-03-08T17:06:15.860 に答える
0

私は解決策を見つけたと思った:

public Event CreateEvent(IPassNow passNow, DateTimeOffset local, DateTimeOffset world)
{
    var args = new Arguments(new { local, world });
    args.Insert(typeof(IPassNow), passNow);
    return _container.Resolve<Event>(args);
}

しかし、これは難読化でも機能しません。 new Arguments(new { local, world }); 順序などで一致させるのではなく、パラメーターのリテラル名も使用します..したがって、これは実際には答えではありません..

于 2014-03-09T20:10:55.583 に答える