结构映射港口温莎城堡
本文关键字:城堡 映射 结构 | 更新日期: 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,但我看到它有类似的自动注册功能,你可能已经在使用