1

我有一些执行器类实现了一个或两个接口(IHandleMessages<> 和/或 CommandExecutor<>)。

我可以将所有这些执行程序类(使用它实现的两个接口中的任何一个或多个)注册为服务吗?最终不会将类上的所有其他接口也作为服务。

我最初的尝试是这样的:

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> { }
}

但这不起作用。有解决方案吗?

我正在使用温莎 3.1.0。

编辑:我想我真正要问的是:是否可以两次找到相同的类型,然后让发现者在该类型的注册中添加更多服务?

4

2 回答 2

1

我已经向 Windsor 提出了一个拉取请求,该请求在 3.2 中被接受,你现在可以这样做:

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

在这里阅读更多

于 2015-02-05T15:37:07.943 回答
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 回答