複数のインターフェイスを実装するクラスがあります。これらのインターフェースを XML 経由で登録したいと考えています。私が見つけたのは、新しい Fluent Interface のドキュメントだけです。このオプションは XML 経由でサポートされていますか? この機能を追加するには何が必要ですか?
1256 次
1 に答える
10
[更新]これは、Windsor2.1以降で可能になりました。構文については、こちらのドキュメントを参照してください。
この機能は、現時点ではXMLインタープリターに実装されていません。ただし、機能を介してサポートを追加することは難しくありません(明らかに、この手法は、既存の構成パーサーにない他の機能を追加する場合にも役立ちます)。
したがって、最初に、型のハンドラーが作成されたことを検出する機能を追加し、同時に、転送されたサービスを登録して、既存のハンドラーを指すようにします。
public class HandlerForwardingFacility : AbstractFacility
{
IConversionManager conversionManager;
protected override void Init()
{
conversionManager = (IConversionManager)Kernel.GetSubSystem(SubSystemConstants.ConversionManagerKey);
Kernel.HandlerRegistered += new HandlerDelegate(Kernel_HandlerRegistered);
}
void Kernel_HandlerRegistered(IHandler handler, ref bool stateChanged)
{
if (handler is ForwardingHandler) return;
var model = handler.ComponentModel;
if (model.Configuration == null) return;
var forward = model.Configuration.Children["forward"];
if (forward == null) return;
foreach (var service in forward.Children)
{
Type forwardedType = (Type)conversionManager.PerformConversion(service, typeof (Type));
Kernel.RegisterHandlerForwarding(forwardedType, model.Name);
}
}
}
そしてもちろん、これをコードで使用する必要があります。この例では、IDuckとIDogの2つの別個のサービスをサポートするミュータントのduck/dogコンポーネントを使用します。
public interface IDog
{
void Bark();
}
public interface IDuck
{
void Quack();
}
public class Mutant : IDog, IDuck
{
public void Bark()
{
Console.WriteLine("Bark");
}
public void Quack()
{
Console.WriteLine("Quack");
}
}
次に、実際にコンテナを構成します。
<castle>
<facilities>
<facility id="facility.handlerForwarding" type="Example.Facilities.HandlerForwardingFacility, Example" />
</facilities>
<components>
<component id="mutant" service="Example.IDog, Example" type="Example.Mutant, Example">
<forward>
<service>Example.IDuck, Example</service>
</forward>
</component>
</components>
</castle>
そして今、私たちはこのようなテストを楽しく実行することができます:
WindsorContainer container = new WindsorContainer(new XmlInterpreter());
var dog = container.Resolve<IDog>();
var duck = container.Resolve<IDuck>();
Assert.AreSame(dog, duck);
お役に立てれば。
于 2008-11-08T03:26:49.337 に答える