9

複数のインターフェイスを実装するクラスがあります。これらのインターフェースを XML 経由で登録したいと考えています。私が見つけたのは、新しい Fluent Interface のドキュメントだけです。このオプションは XML 経由でサポートされていますか? この機能を追加するには何が必要ですか?

4

1 に答える 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 に答える