2014-12-15 5 views
5

Was ich habe, ist eine Bühne, einige Schnittstellen, sowie Abschnitt Registrierung. Das Problem ist, dass ich einige Parameter als fest und andere als Variablen definieren muss.für Konstruktor Klasse fester Werte angeben und andere Variablen aus dem Behälter

interface IDoSomething { 
void DoWork(); 
} 

interface IDoMath(){ 
void DoWork(); 
} 

interface IBehaviorBusiness{ 
void Do(); 
} 

class BehaviorBusiness { 
... 
public BehaviorBusiness(IDoSomething doSomething, IDoMatch doMatch, string connection){}; 
... 
} 

Ist es möglich, mit windsor Behälter, der eine Parameter-Verbindung in Deklaration, zu definieren und IDosomething und IDoMatch aus dem Behälter nehmen?

container.Register(
    Component.For<IDoSomething>() 
    ... 
} 

container.Register(
    Component.For<IDoMatch>() 
    ... 
); 

, dass das konkrete Problem.

container.Register(
    Component.For<IBehaviorBusiness>() 
    .ImplementedBy<BehaviorBusiness>() 
    .DependsOn(Dependency.OnComponent<IDoSomething, [default]>(), 
       Dependency.OnComponent<IDoMatch, [default]>(), 
       Dependency.OnValue("connection", connectionString)) 
    .LifeStyle.Transient 
    ); 

Welche ist die korrekte Syntax, wenn es vorhanden ist?

+0

@PatrickQuirk Antwort ist richtig, aber ich denke, ein besserer Ansatz ist IConnectionString Anbieter oder direkt IConnectionProvider und servieren es in der Ctor eher als ein direkter Parameter zu machen. Auf diese Weise ist die jeweilige Klasse nicht dafür verantwortlich, die Verbindung jedes Mal zu erstellen/verwalten/zu beseitigen. Wie wäre es, wenn Sie die Verbindung von einer anderen Komponente aus bereitstellen und sie dann bündeln und dann entsorgen? Auf diese Weise behalten Sie die SRP nicht nur, um einige Prinzipien zu erhalten, sondern auch um die Wartungsfreundlichkeit Ihres Codes zu gewährleisten. Können Sie ein Beispiel für die Verwendung Ihrer Verbindungszeichenfolge angeben? –

+0

Nun, das Projekt ist wirklich klein und einfach. Du hast recht. schließlich geändert i-Anschluss für eine Dummy-Schnittstelle für Abfrage, aktualisieren öffentliche Schnittstelle IDbContext { DataSet GetDataSet (string strmSql); DataTable GetDataTable (Zeichenfolge strmSql); int ExecuteSql (Zeichenfolge strmSql); } einige wirklich einfache –

+0

@OgnyanDimitrov wo kann ich lesen über Best Practices für implementiert IConnectionString o IConnectionProvider? Die nächste Woche arbeiten in einigen wirklich ernst und vielleicht lesen Sie ein wenig über das Thema, es wäre angemessen. Ich erwäge die Verwendung von EF oder NHibernate –

Antwort

1

Wenn die Verbindungszeichenfolge von Anwendungseinstellungen kommt, dann Dependency.OnAppSettingsValue() verwenden:

container.Register(
    Component.For<IBehaviorBusiness>() 
    .ImplementedBy<BehaviorBusiness>() 
    .DependsOn(Dependency.OnAppSettingsValue("connection", "connectionString")) 
    .LifeStyle.Transient 
); 

Hier „Verbindung“ ist der Name des Parameters in der Klasse Konstruktor und ‚Connection‘ ist der Schlüssel Ihre Verbindungszeichenfolge in Ihren Anwendungseinstellungen (z. B. Web.Config). Sie müssen die anderen Werte nicht angeben, Windsor löst sie wie gewöhnlich.

+0

vielen dank, bro –