C# 结构图港口至温莎城堡

C# 结构图港口至温莎城堡,c#,castle-windsor,structuremap,C#,Castle Windsor,Structuremap,我正在尝试将一些structuremap代码移植到castle windor。目前,我遇到了以下错误: No component for supporting the service CreateTestCommandHandler was found 我正在使用一个控制台应用程序来测试: 控制台应用程序: private static IWindsorContainer _container; ... static void Main() { _container = new Windsor

我正在尝试将一些structuremap代码移植到castle windor。目前,我遇到了以下错误:

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;
            }
...
以及:


看来你误解了温莎是如何找到你的组件的。您可以显式注册组件(就像您在
域安装程序
中对
IDomainRepository
所做的那样),也可以按照约定注册程序集中的所有类型(例如)。无论如何,如果你不告诉温莎你的类型,它会抛出你收到的异常

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


我对StructureMap了解不多,但我知道您可能已经在使用了。

能否显示注册
CreateTestCommandHandler
的代码以及发生错误的代码?谢谢您的回复。我已经修改了我原来的问题(见PS)。该异常在GetCorrectlyInjectedCommandHandler中引发。我不得不说,我对必须注册CreateTestCommandHandler有点困惑,因为它是一个具体的?我在过去使用过两者的混合。问题是我想首先复制原始的structuremap代码。您必须向Windsor注册
CreateTestCommandHandler
。如果要手动执行,则调用
container.Register(Component.For())这是来自的。谢谢,这成功了。我会研究医生的。你知道如何“自动”做到这一点吗?如果我没记错的话,我认为给定一个类的程序集,您可以这样做。通过使用我上面提到的注册为约定,可以自动完成这项工作。你基本上是在告诉Windsor“在这个组件中注册所有类型,使用这种生活方式,使用这种接口映射策略等等。”查看我回答中的链接,这相当直观,但有很多配置选项。
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>>());
ForRequestedType<IDomainRepository<IDomainEvent>>()
 .TheDefault.Is.OfConcreteType<DomainRepository<IDomainEvent>>();
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);
        }
    }