Func <T>注入Windsor容器

yan*_*ang 4 delegates castle-windsor

以下是与Autofac配合使用的AspComet项目的代码摘录.

public MessageBus(IClientRepository clientRepository, Func<IMessagesProcessor> messagesProcessorFactoryMethod)
{
    this.clientRepository = clientRepository;
    this.messagesProcessorFactoryMethod = messagesProcessorFactoryMethod;
}
Run Code Online (Sandbox Code Playgroud)

如何Func<IMessagesProcessor> messagesProcessorFactoryMethod用温莎注入" ",是否可能?

谢谢.

Nei*_*afi 6

Container.Register(
  Component.For<IMessagesProcessor>()
           .ImplementedBy<MessagesProcessor>()
           .Lifetime.Transient,
  Component.For<Func<IMessagesProcessor>>()
           .Instance(() => Container.Resolve<IMessagesProcessor>())
)
Run Code Online (Sandbox Code Playgroud)

这应该够了吧


Mar*_*ann 5

container.Register(Component.For<Func<Foo>>().Instance(f));
Run Code Online (Sandbox Code Playgroud)

这是一个通过的单元测试,演示了这个概念:

[TestMethod]
public void Test2()
{
    Func<string> f = () => "Hello world";

    var container = new WindsorContainer();
    container.Register(Component.For<Func<string>>().Instance(f));

    var resolvedFunc = container.Resolve<Func<string>>();

    Assert.AreEqual("Hello world", f());
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用以下自定义工具获得类似 Autofac 的行为,无需额外工作: http://www.assembla.com/code/kkozmic/subversion/nodes/Garage/Castle.LightweightFactoryFacility 如果您不想使用设施,您在之前的评论中概述的解决方案是可行的方法。 (4认同)