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. HandlerSelector
  2. 型式 工場設備
  3. UsingFactoryMethod
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 に答える