结构映射港口温莎城堡

本文关键字:城堡 映射 结构 | 更新日期: 2023-09-27 18:08:54

我正在尝试将一些结构映射代码移植到城堡窗口。目前,我得到这个错误:

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中抛出(原始结构映射代码可以在这里找到):

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

结构映射港口温莎城堡

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

看一下约定注册,它往往是一个容易开始的地方,可以减少大量的维护工作。如果您需要更改特定组件的生活方式或其他属性,您可以通过执行手动注册(再次像上面所做的那样)来覆盖任何自动注册。

我不太了解StructureMap,但我看到它有类似的自动注册功能,你可能已经在使用