3

您好,已将以下组件注册到 Castle Windsor:

public class CommandDispatcher : IServiceCommandDispatcher
{
    private readonly IWindsorContainer container;

    public CommandDispatcher(IWindsorContainer container)
    {
        this.container = container;
    }

    #region IServiceCommandDispatcher Members

    public void Dispatch<TCommand>(TCommand command) where TCommand : IServiceCommand
    {
        var handler = container.Resolve<IServiceCommandHandler<TCommand>>();
        handler.Handle(command);
    }

    #endregion
}

并且 dispatcher 的注册方式如下:

Component
   .For<IServiceCommandDispatcher>()
   .ImplementedBy<CommandDispatcher>(),

但是当我解析调度程序的实例时,字段容器为空。我应该怎么做才能将容器传递给已解决的子项?

4

2 回答 2

3

Windsor 使用Typed Factory Facility为您解决了这个问题。

在下面的示例中,我希望实现ICommandHandlerFactory从我的 Windsor 容器中解析我的命令处理程序。

class CommandDispatcher : IServiceCommandDispatcher
{
    private readonly ICommandHandlerFactory factory;

    public CommandDispatcher(ICommandHandlerFactory factory)
    {
        this.factory = factory;
    }

    public void Dispatch<T>(T command) where T : IServiceCommand
    {
        var handler = this.factory.Create(command);
        handler.Handle(command);
        this.factory.Destroy(handler);
    }
}

为此,我只需要创建ICommandHandlerFactory接口。

public interface ICommandHandlerFactory
{
    Handles<T> Create<T>(T command) where T : IServiceCommand;
    void Destroy(object handler);
}

不需要实现,ICommandHandlerFactory因为 Windsor 将创建实现。Windsor 使用的约定是返回对象的resolve方法是方法,返回 void 的方法是release方法。

要注册工厂,您需要包含using Castle.Facilities.TypedFactory,然后按如下方式注册您的工厂

container.AddFacility<TypedFactoryFacility>();

container.Register(
     Component.For<ICommandHandlerFactory>()
         .AsFactory()
);

重申一下,您不必为您的工厂编写任何实现代码。

于 2015-08-05T06:33:06.337 回答
0

这有效:

container.Register(Component.For<IWindsorContainer>().Instance(container));

这并不理想,因为您仍然必须调用Resolve方法。使用工厂可能有更好的方法来做到这一点。这看起来类似于您正在尝试做的事情:

http://kozmic.net/2010/03/11/advanced-castle-windsor-ndash-generic-typed-factories-auto-release-and-more/

于 2014-12-10T13:40:26.450 回答