このXML構成を考えると(これは機能します)
<component type="X.Y.Z.ActivityService, X.Y.Z.Services" id="X.Y.Z.ActivityService" lifestyle="transient">
<parameters>
<Listeners>
<array>
<item>${DefaultActivityListener}</item>
</array>
</Listeners>
</parameters>
</component>
<component type="X.Y.Z.DefaultActivityListener, X.Y.Z.Services" id="DefaultActivityListener" lifestyle="transient" />
以下のように流暢な API を使用するように変換しました (これは機能しません)。
Container.Register(
Component.For<X.Y.Z.ActivityService>()
.ServiceOverrides(
ServiceOverride.ForKey("Listeners").Eq(typeof(X.Y.Z.DefaultActivityListener).Name))
.LifeStyle.Transient
);
Container.Register(
Component.For<X.Y.Z.DefaultActivityListener>()
.Named("DefaultActivityListener")
.LifeStyle.Transient
);
X.Y.Z.ActivityService
ウィンザーのインスタンスを解決しようとすると、 NotImplementedException
in がスローされCastle.MicroKernel.SubSystems.Conversion.ArrayConverter.PerformConversion(String, Type)
ます。
PerformConversion メソッドの実装は次のとおりです。
public override object PerformConversion(String value, Type targetType)
{
throw new NotImplementedException();
}
ServiceOverrides
呼び出しを削除すると、すべてが期待どおりに動作することを追加する必要があります。そのため、Listeners パラメータを配線する方法に特に問題があります。ちなみにリスナーは、コンストラクターのパラメーターではなくプロパティです。
XML 構成が期待どおりに機能するのを見て、同じ結果を達成するために流暢な API (PerformConversion メソッドの実装以外) をどのように使用するのが最適ですか?
リリース 2.0 を使用しています。
編集
流暢な API を使用するかどうかに関係なく、コードでこの構成をどのように実現するかという質問を拡張します。
アップデート
単一の要素を配列プロパティに割り当てようとすると、問題が発生するようです。問題を説明するために以下に提供される単体テスト。
namespace Components
{
public class A
{
public I[] I { get; set; }
}
public interface I
{
string Name { get; }
}
public class B : I
{
public string Name { get { return "B"; } }
}
public class C : I
{
public string Name { get { return "C"; } }
}
}
[TestMethod]
public void ArrayPropertyTestApi()
{
//PASSES
using (Castle.Windsor.WindsorContainer container = new Castle.Windsor.WindsorContainer())
{
container.Register(Component.For<Components.A>().ServiceOverrides(ServiceOverride.ForKey("I").Eq(typeof(Components.B).FullName, typeof(Components.C).FullName)));
container.Register(Component.For<Components.B>());
container.Register(Component.For<Components.C>());
Components.A svc = container.Resolve<Components.A>();
Assert.IsTrue(svc.I.Length == 2);
Assert.IsTrue(svc.I[0].Name == "B");
Assert.IsTrue(svc.I[1].Name == "C");
}
}
[TestMethod]
public void ArrayPropertyTestApi2()
{
//FAILS
using (Castle.Windsor.WindsorContainer container = new Castle.Windsor.WindsorContainer())
{
container.Register(Component.For<Components.A>().ServiceOverrides(ServiceOverride.ForKey("I").Eq(typeof(Components.B).FullName)));
container.Register(Component.For<Components.B>());
container.Register(Component.For<Components.C>());
Components.A svc = container.Resolve<Components.A>(); //Throws NotImplementedException
Assert.IsTrue(svc.I.Length == 1);
Assert.IsTrue(svc.I[0].Name == "B");
}
}
質問はまだ立っています。
ありがとう。