Frage

Sagen, dass ich die folgende Klasse haben

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

Ich kann eine Instanz davon mit Schloss windsor über xml registrieren wie folgt

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

Wie würde ich mich über die genau die gleiche Sache zu tun, aber in Code? (Hinweis, die Konstruktor-Parameter)

War es hilfreich?

Lösung

Edit: Verwendet, um die Antworten unten Code mit dem 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));
        }

    }
}

Andere Tipps

Versuchen Sie, diese

int start_at = 1; 
container.Register(Component.For().DependsOn(dependency: Dependency.OnValue(start_at)));

Haben Sie mit Binsor als Ihre Container konfigurieren? Anstatt ausführlich und plump XML können Sie Windsor mit einem Boo basierten DSL konfigurieren. Hier ist, was Ihre Konfiguration aussehen wird:

component IMyComponent, MyComponent:
   start_at = 1

Der Vorteil ist, dass Sie eine formbare Konfigurationsdatei haben, aber die Probleme mit XML zu vermeiden. Auch müssen Sie nicht neu kompilieren Ihre Konfiguration ändern, wie würden Sie, wenn Sie die Container in Code konfigurieren.

Es gibt auch viele Hilfsmethoden, die ohne Reibung Konfiguration aktivieren:

  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

Sie können damit beginnen hier .

Sie müssen in einem IDictionary passieren, wenn Sie den Behälter für die Instanz fragen.

Sie würden diese Resolve Überlastung des IWindsorContainer verwenden:

T Resolve<T>(IDictionary arguments)

oder die nicht generische:

object Resolve(Type service, IDictionary arguments)

So zum Beispiel: (unter der Annahme Behälter ist ein IWindsorContainer)

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

Beachten Sie, dass die Schlüsselwerte im Wörterbuch Groß- und Kleinschreibung.

Sie können eine Konfigurationsklasse verwenden, um die app.config zu lesen. Dann, dass registrieren und windsor, um es für seine Abhängigkeit erhalten. Im Idealfall würde meine MyConfiguration eine Schnittstelle verwendet werden.

public class MyConfiguration
{
    public long CacheSize { get; }

    public MyConfiguration()
    {
        CacheSize = ConfigurationManager.AppSettings["cachesize"].ToLong();
    }
}



container.Register(Component.For<MyConfiguration>().ImplementedBy<MyConfiguration>());

container.Register(Component.For<MostRecentlyUsedSet<long>>()
.ImplementedBy<MostRecentlyUsedSet<long>>().
DependsOn(Dependency.OnValue("size", container.Resolve<MyConfiguration>().CacheSize))
.LifestyleSingleton());

Sie können die AddComponentWithProperties Methode des IWindsorContainer Schnittstelle verwenden, um einen Dienst mit erweiterten Eigenschaften zu registrieren.

Im Folgenden finden Sie eine 'Arbeits' Probe diese mit einem NUnit Unit-Test zu tun.

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));
        }

    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top