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
}

また、ディスパッチャは次の方法で登録されます。

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

しかし、ディスパッチャのインスタンスを解決すると、フィールドコンテナは null です。コンテナを解決された子アイテムに渡すにはどうすればよいですか?

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

ICommandHandlerFactoryWindsor が実装を作成するため、 の実装は必要ありません。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 に答える