gpt4 book ai didi

caSTLe-windsor - 温莎,在类里面注入(inject)容器

转载 作者:行者123 更新时间:2023-12-02 02:06:45 26 4
gpt4 key购买 nike

您好,已将以下组件注册到 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>(),

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

最佳答案

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 接口(interface)。

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

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

关于caSTLe-windsor - 温莎,在类里面注入(inject)容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14622624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com