1

1つまたは2つのインターフェイス(IHandleMessages<>および/またはCommandExecutor<>)を実装するエグゼキュータクラスがいくつかあります。

これらすべてのエグゼキュータクラス(2つのうち実装するインターフェイス)をサービスとして登録できますか?クラス上の他のすべてのインターフェースもサービスとして使用することになりません。

私の最初の試みはこれでした:

public class Test
{
    [Fact]
    public void SomeTest()
    {
        var container = new WindsorContainer();
        container.Register(Classes.FromThisAssembly().BasedOn(typeof(CommandExecutor<>)).WithService.Base().LifestyleTransient(),
                           Classes.FromThisAssembly().BasedOn(typeof(IHandleMessages<>)).WithService.Base().LifestyleTransient());

        container.ResolveAll<CommandExecutor<object>>().Count().ShouldBe(2);
        container.ResolveAll<IHandleMessages<object>>().Count().ShouldBe(2);
    }

    public interface IHandleMessages<T> { }
    public interface CommandExecutor<T> { }

    public class HandlesMessagesOnly : IHandleMessages<object> { }
    public class HandlesMessagesAndExecutesCommands : CommandExecutor<object>, IHandleMessages<object> { }
    public class ExecutesCommandsOnly : CommandExecutor<object> { }
}

しかし、それは機能しません。これに対する解決策はありますか?

Windsor3.1.0を使用しています。

編集:私が本当に求めているのは、同じタイプを2回見つけて、そのタイプの登録にさらにサービスを追加することは可能ですか?

4

2 に答える 2

1

これにより、テストに合格します。

container.Register(
    Classes
        .FromThisAssembly()
        .BasedOn(typeof(CommandExecutor<>))
        .WithServiceBase()
        .WithServiceFirstInterface()     // Ensures first interface is included.
        .LifestyleTransient(),
    Classes
        .FromThisAssembly()
        .BasedOn(typeof(IHandleMessages<>))
        .WithServiceBase()
        .LifestyleTransient()
);

より高度なインターフェイス選択手法については、この質問を参照してください。

于 2012-08-25T04:48:00.007 に答える
1

3.2で受け入れられたWindsorにプルリクエストを送信しました。これで、次のことが可能になります。

Container.Register(
   Classes.FromThisAssembly()
      .BasedOn<IFoo>()
      .OrBasedOn(typeof(IBar))
      .WithServiceBase()
  .LifestyleTransient());

詳細はこちら

于 2015-02-05T15:37:07.943 に答える