2

以下の構成を考えると

        Container.Register(Component.For<A>().Named("foo"));
        Container.Register(Component.For<B>().Named("foobar"));

        Container.Register(
            AllTypes.Pick()
            .FromAssemblyNamed("MyAssembly")
            .If(t => t.Name.EndsWith("ABC"))
            .Configure(c => c.LifeStyle.Is(LifestyleType.Transient))
            .WithService.Select(i => typeof(I))
        );

        Container.Register(
            AllTypes.Pick()
            .FromAssemblyNamed("MyAssembly")
            .If(t => t.Name.EndsWith("123"))
            .Configure(c => c.LifeStyle.Is(LifestyleType.Transient))
            .WithService.Select(i => typeof(I))
        );

インターフェイス「I」がプロパティ「P」を公開し、クラス A と B を P に割り当てることができることがわかっている場合。AllTypes 呼び出しからの型の最初のコレクションは、"foo" の ID を持つ型に設定されたプロパティ P を持つ必要があり、2 番目のコレクションは "foobar" の ID を持つ型に設定された同じプロパティを持つ必要があることを明示的に述べるにはどうすればよいですか? "?

XML 構成を使用すると、${id} 表記を使用してパラメーターを明示的に設定することで、これを行うことができます。流暢なAPIでも同様だと思います。

ありがとう。

4

3 に答える 3

2

あなたは正しい軌道に乗っています - あなたがする必要があるのは、シナリオに応じて値 "${foo}" または "${foobar}" を持つ "P" という名前のパラメーターを提供して、各コンポーネントのパラメーターを構成することです。シナリオを示す作業 xunit ファクト (実際の登録コードの一番下に向かってスクロールします)。

namespace Question651392
{
  public class First123 : I
  {
    public AbstractLetter P { get; set; }
  }

  public class Second123 : I
  {
    public AbstractLetter P { get; set; }
  }

  public class FirstABC : I
  {
    public AbstractLetter P { get; set; }
  }

  public class SecondABC : I
  {
    public AbstractLetter P { get; set; }
  }

  public interface I
  {
    AbstractLetter P { get; set; }
  }

  public abstract class AbstractLetter
  {
  }

  public class B : AbstractLetter
  {
  }

  public class A : AbstractLetter
  {
  }

  public class RegistrationFacts
  {
    [Fact]
    public void EnsureParametersCanBeSetWhenRegisteringComponentsInBulk()
    {
      WindsorContainer Container = new WindsorContainer();

      Container.Register(Component.For<A>().Named("foo"));
      Container.Register(Component.For<B>().Named("foobar"));

      Container.Register(
          AllTypes.Pick()
          .FromAssembly(GetType().Assembly)
          .If(t => t.Name.EndsWith("ABC"))
          .Configure(c => c.LifeStyle.Is(LifestyleType.Transient))
          .Configure(c=>c.Parameters(Parameter.ForKey("P").Eq("${foo}")))
          .WithService.Select(new[] { typeof(I) })          
      );

      Container.Register(
          AllTypes.Pick()
          .FromAssembly(GetType().Assembly)
          .If(t => t.Name.EndsWith("123"))
          .Configure(c => c.LifeStyle.Is(LifestyleType.Transient))
          .Configure(c => c.Parameters(Parameter.ForKey("P").Eq("${foobar}")))
          .WithService.Select(new[] { typeof(I)})
      );

      var all = Container.ResolveAll<I>();

      var firstABC = all.Single(i => i is FirstABC);
      Assert.IsType(typeof(A), firstABC.P);

      var first123 = all.Single(i => i is First123);
      Assert.IsType(typeof (B), first123.P);

      Assert.Equal(4, all.Count());
    }
  }
}

お役に立てれば!

于 2009-03-17T09:20:53.990 に答える
1

実際に@Bittercoderの包括的な回答に追加するために、推奨される方法は次のとおりです。

.DependsOn(Property.ForKey("P").Is("fooBar"))
于 2011-04-23T03:06:36.523 に答える