我有一些执行器类,它们实现一个或两个接口(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> { }
}
但这不起作用。有解决方案吗?
我正在使用Windsor 3.1.0。
编辑:我想我真正要问的是:是否可以两次找到相同的类型,并让发现者为该类型的注册添加更多服务?
答案 0 :(得分:1)
这将使您的测试通过:
container.Register(
Classes
.FromThisAssembly()
.BasedOn(typeof(CommandExecutor<>))
.WithServiceBase()
.WithServiceFirstInterface() // Ensures first interface is included.
.LifestyleTransient(),
Classes
.FromThisAssembly()
.BasedOn(typeof(IHandleMessages<>))
.WithServiceBase()
.LifestyleTransient()
);
有关更复杂的界面选择技巧,请参阅this question。
答案 1 :(得分:1)
我已经向温莎提出拉动请求,该请求已在3.2中被接受,您现在可以执行此操作:
Container.Register(
Classes.FromThisAssembly()
.BasedOn<IFoo>()
.OrBasedOn(typeof(IBar))
.WithServiceBase()
.LifestyleTransient());