我正在尝试将一些结构图代码移植到城堡风口。目前,我收到了这个错误:
No component for supporting the service CreateTestCommandHandler was found
我正在使用控制台应用来测试:
控制台应用:
private static IWindsorContainer _container;
...
static void Main()
{
_container = new WindsorContainer();
ApplicationBootStrapperCastleWindsor.BootStrap(_container);
...
更简短的代码:
public class CreateTestCommandHandler : ICommandHandler<CreateTestCommand>
{
private readonly IDomainRepository<IDomainEvent> _repository;
public CreateTestCommandHandler(IDomainRepository<IDomainEvent> repository)
{
_repository = repository;
}
...
和
public class ApplicationBootStrapperCastleWindsor
{
public void BootStrapTheApplication(IWindsorContainer container)
{
container.Install(new DomainInstaller());
}
public static void BootStrap(IWindsorContainer container)
{
new ApplicationBootStrapperCastleWindsor().BootStrapTheApplication(container);
}
}
和
public class DomainInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Component.For<IDomainRepository<IDomainEvent>>().ImplementedBy<DomainRepository<IDomainEvent>>());
有人可以看到任何明显的错误吗?检查容器我也在可能重新配置的组件中获得了IDomainRepository。
原始的结构图代码如下:
ForRequestedType<IDomainRepository<IDomainEvent>>()
.TheDefault.Is.OfConcreteType<DomainRepository<IDomainEvent>>();
PS:
在GetCorrectlyInjectedCommandHandler中抛出实际异常(可以找到原始结构图代码here):
public class RegisterCommandHandlersInMessageRouter
{
private static IWindsorContainer _container;
public static void BootStrap(IWindsorContainer container)
{
_container = container;
new RegisterCommandHandlersInMessageRouter().RegisterRoutes(new MessageRouter());
}
private static object GetCorrectlyInjectedCommandHandler(Type commandHandler)
{
return _container.Resolve(commandHandler);
}
}
答案 0 :(得分:1)
您似乎误解了Windsor如何找到您的组件。您可以显式注册组件(就像您在IDomainRepository<IDomainEvent>
中对DomainInstaller
所做的那样),也可以通过约定在程序集中注册所有类型(例如)。无论哪种方式,如果你不告诉温莎你的类型,它会抛出你收到的异常。
看看registration by convention,它往往是一个容易开始的地方,可以减少很多维护工作。如果您需要更改特定组件的生活方式或其他特性,您可以通过执行手动注册来覆盖任何自动注册(如上所述)。
我对StructureMap了解不多,但我看到你可能已经在使用it has similar auto-registration functionality。