结构图端口到城堡温莎

时间:2014-06-17 14:14:43

标签: c# castle-windsor structuremap

我正在尝试将一些结构图代码移植到城堡风口。目前,我收到了这个错误:

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);
        }
    }

1 个答案:

答案 0 :(得分:1)

您似乎误解了Windsor如何找到您的组件。您可以显式注册组件(就像您在IDomainRepository<IDomainEvent>中对DomainInstaller所做的那样),也可以通过约定在程序集中注册所有类型(例如)。无论哪种方式,如果你不告诉温莎你的类型,它会抛出你收到的异常。

看看registration by convention,它往往是一个容易开始的地方,可以减少很多维护工作。如果您需要更改特定组件的生活方式或其他特性,您可以通过执行手动注册来覆盖任何自动注册(如上所述)。

我对StructureMap了解不多,但我看到你可能已经在使用it has similar auto-registration functionality