C# 结构图港口至温莎城堡
我正在尝试将一些structuremap代码移植到castle windor。目前,我遇到了以下错误: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
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);
}
}