0

使用 Castle Windsor 3.2,我需要根据上下文参数动态解决服务实现。这是我想做的基本示例:

我有一个服务 IFoo

public interface IFoo
{
   object GetSomething();
}

由 2 个不同的类 Foo1 和 Foo2 实现

public class FooBase
{
   public int Number {get; private set;}

   public FooBase(int number)
   {
      Number = number;
   }
}

public class Foo1 : IFoo
{
   public Foo1(int number):base(number)
   public object GetSomething()
   {
      return "Foo1";
   }
}

public class Foo2 : IFoo
{
   public Foo2(int number):base(number)
   public object GetSomething()
   {
      return "Foo2";
   }
}

我想用数字作为参数调用城堡温莎解析方法,并根据我想要 Foo1 或 Foo2 对象的数字:

var foo1 = container.Resolve<IFoo>(new {number= 1});
// foo1 is Foo1
var foo2 = container.Resolve<IFoo>(new {number= 2});
// foo2 is Foo2

我尝试了几种可能的解决方案,但由于缺少 Castle Windsor 文档和示例,我真的很困惑,此外,大多数示例都不是最新的并且使用的是过时的 API。

因此,我看到了一些使用以下概念的示例,但它们似乎都不是我的要求:

  1. 处理程序选择器
  2. 类型化工厂设施
  3. 使用工厂方法
4

2 回答 2

1

这是对我有用的代码:

container = new WindsorContainer();
        container.AddFacility<TypedFactoryFacility>();
        container.Register(
            Component.For<IFoo>().ImplementedBy<Foo1>().Named("Foo1"),
            Component.For<IFoo>().ImplementedBy<Foo2>().Named("Foo2"),
            Component.For<IFooFactory>().AsFactory(c => c.SelectedWith<FooSelector>())
        );

创建一个 Foo 工厂:

public interface IFooFactory
{
    IFoo CreateFoo(int number);
}

和一个选择器:

public class FooSelector : DefaultTypedFactoryComponentSelector
{
    protected override string GetComponentName(System.Reflection.MethodInfo method, object[] arguments)
    {
        var argument = (int) arguments[0];
        return string.Format("Foo{0}", argument);
    }
}
于 2013-07-05T14:52:39.150 回答
1

使用以下注册码:

container = new WindsorContainer();
        container.AddFacility<TypedFactoryFacility>();
        container.Register(
            Component.For<FooSelector>,
            Component.For<Foo1>(),
            Component.For<Foo2>(),
            Component.For<IFooFactory>().AsFactory(c => c.SelectedWith<FooSelector>())
        );

创建一个 Foo 工厂:

public interface IFooFactory
{
    IFoo CreateFoo(int number);
}

和一个选择器:

public class FooSelector : DefaultTypedFactoryComponentSelector
{
    protected override Type GetComponentType(System.Reflection.MethodInfo method, object[] arguments)
    {
        var argument = (int) arguments[0];
        if (argument == 1) return typeof (Foo1);
        if (argument == 2) return typeof(Foo2);
        throw new ApplicationException();
    }
}

现在解析 IFooFactory 并使用您想要的值调用 create 方法。

亲切的问候,马尔维恩。

于 2013-07-05T13:22:37.287 回答