11

次のクラスがあるとします

MyComponent : IMyComponent {
  public MyComponent(int start_at) {...}
}

次のように、xml 経由で城のウィンザーにそのインスタンスを登録できます。

<component id="sample"  service="NS.IMyComponent, WindsorSample" type="NS.MyComponent, WindsorSample">  
  <parameters>  
    <start_at>1</start_at >  
  </parameters>  
</component>  

まったく同じことをコードで行うにはどうすればよいですか? (注意、コンストラクターのパラメーター)

4

6 に答える 6

16

編集:Fluent Interfaceで以下のコードの回答を使用しました:)

namespace WindsorSample
{
    using Castle.MicroKernel.Registration;
    using Castle.Windsor;
    using NUnit.Framework;
    using NUnit.Framework.SyntaxHelpers;

    public class MyComponent : IMyComponent
    {
        public MyComponent(int start_at)
        {
            this.Value = start_at;
        }

        public int Value { get; private set; }
    }

    public interface IMyComponent
    {
        int Value { get; }
    }

    [TestFixture]
    public class ConcreteImplFixture
    {
        [Test]
        void ResolvingConcreteImplShouldInitialiseValue()
        {
            IWindsorContainer container = new WindsorContainer();

            container.Register(
                Component.For<IMyComponent>()
                .ImplementedBy<MyComponent>()
                .Parameters(Parameter.ForKey("start_at").Eq("1")));

            Assert.That(container.Resolve<IMyComponent>().Value, Is.EqualTo(1));
        }

    }
}
于 2008-09-18T14:59:08.923 に答える
2

これを試して

int start_at = 1; 
container.Register(Component.For().DependsOn(dependency: Dependency.OnValue(start_at)));
于 2014-10-14T14:30:42.963 に答える
1

Binsor を使用してコンテナーを構成することを検討しましたか? 冗長でぎこちない XML ではなく、Boo ベースの DSL を使用して Windsor を構成できます。設定は次のようになります。

component IMyComponent, MyComponent:
   start_at = 1

利点は、順応性のある構成ファイルを使用しながら、XML の問題を回避できることです。また、コードでコンテナーを構成した場合のように、構成を変更するために再コンパイルする必要はありません。

また、ゼロ フリクション構成を可能にするヘルパー メソッドも多数あります。

  for type in Assembly.Load("MyApp").GetTypes():
    continue unless type.NameSpace == "MyApp.Services"
    continue if type.IsInterface or type.IsAbstract or type.GetInterfaces().Length == 0
    component type.GetInterfaces()[0], type

ここから始めることができます。

于 2008-11-07T01:12:21.807 に答える
0

コンテナーにインスタンスを要求するときは、IDictionary を渡す必要があります。

IWindsorContainer のこの Resolve オーバーロードを使用します。

T Resolve<T>(IDictionary arguments)

または非一般的なもの:

object Resolve(Type service, IDictionary arguments)

例: (コンテナが IWindsorContainer であると仮定)

IDictionary<string, object> values = new Dictionary<string, object>();
values["start_at"] = 1;
container.Resolve<IMyComponent>(values);

ディクショナリのキー値は大文字と小文字が区別されることに注意してください。

于 2008-09-17T21:32:27.097 に答える
-1

IWindsorContainer インターフェイスの AddComponentWithProperties メソッドを使用して、サービスを拡張プロパティに登録できます。

以下は、NUnit 単体テストでこれを行う「実際の」サンプルです。

namespace WindsorSample
{
    public class MyComponent : IMyComponent
    {
        public MyComponent(int start_at)
        {
            this.Value = start_at;
        }

        public int Value { get; private set; }
    }

    public interface IMyComponent
    {
        int Value { get; }
    }

    [TestFixture]
    public class ConcreteImplFixture
    {
        [Test]
        void ResolvingConcreteImplShouldInitialiseValue()
        {
            IWindsorContainer container = new WindsorContainer();
            IDictionary parameters = new Hashtable {{"start_at", 1}};

            container.AddComponentWithProperties("concrete", typeof(IMyComponent), typeof(MyComponent), parameters);

            IMyComponent resolvedComp = container.Resolve<IMyComponent>();

            Assert.That(resolvedComp.Value, Is.EqualTo(1));
        }

    }
}
于 2008-09-18T15:11:44.603 に答える