2012-07-26 7 views
8

Ich habe einige globale Komponenten Ich bin mir nicht sicher, wie man sie in Design einfügt. Wie zum Beispiel:Setter Injection oder Ambient Context Muster

  • Einstellungen Klasse: es die Anfangseinstellungen des Programms ist eine Schnittstelle, könnte es app.config (1way), web.config (1way), hart codierte Werte (1-fach) werden, oder sqldb (2way) hinter den Kulissen.

  • Sprachklasse: es enthält verschiedene Sprachensätze, und wieder konnte ich einige resx Dateien (1-fach) hat, hart codierte Werte (1-fach) oder sqldb (2-fach) dahinter.

Die erste Frage ist, sollte ich diese Klassen Set-Eigenschaften in Abhängigkeit Injection machen (ich benutze Windsor):

public ISettings Settings {set;} 
public ILanguage Language {set;} 

Oder soll ich sie Umgebungskontext machen:

string DoSomethingAndReportIt() { 
    //do something ... 
    var param = Settings.Current.SomeParam; 
    //report it ... 
    return Language.Current.SomeClass_SomeMethod_Job_Done; 
} 

I Beachten Sie, dass es einige Komponenten in der .net-Bibliothek gibt, die ein Umgebungskontextmuster verwenden, z System.Security.Principal, System.Web.ProfileBase, System.Thread.CurrentCulture ...

Glaubst du, es ist kein Schaden, um meine globalen Klassen wie Einstellungen und Sprache zu Umgebungskontextklassen zu machen? Wenn nicht, warum wird DI bevorzugt? Nutzen sie den Komponententest im Vergleich zur Umgebung besser? Die zweite Frage ist, wenn DI besser ist, (ich habe das Gefühl, dass das DI-Muster bevorzugt wird), was ist eine gute Möglichkeit, die vorhandenen Umgebungsklassen wie Security.Principal oder Profile zu übernehmen, um dem DI-Muster zu folgen?

Antwort

3

Umgebungskontext ist OK, wenn Sie Funktionalität implementieren müssen, die sich über mehrere Ebenen erstreckt. (In Ihrem Fall sagen Sie, dass die beiden Objekte global sind) Diese Funktion ist bekannt als Querschneider betrifft. Wie Sie bemerkt haben, sind viele Klassen in .NET als Umgebungskontext, wie IPrincipal implementiert. Um eine funktionierende Version Ihrer Implementierung von Umgebungskontext zu erhalten, müssen Sie für Ihre Objekte Settings und Language einen Standardwert bereithalten, wenn sie als Umgebungskontext entwickelt werden. Meine Annahme ist, dass Sie einige Standardimplementierung von ILanguage und ISettings bereitstellen werden, und angesichts der Tatsache, dass Sie sie global verwenden werden, sind sie gute Kandidaten für Umgebungskontext.

Auf der anderen Seite, wie oft planen Sie, die Objekte zu verwenden, die diese beiden Schnittstellen implementieren? Und, ist die Existenz der beiden Objekte entscheidend, also Settings != null und Language != null? Wenn Sie wirklich beabsichtigen, sie in einer oder zwei Klassen zu verwenden, und/oder wenn die Existenz der Objekte nicht wirklich wichtig ist, können Sie mit der Setter-Injektion gehen. Die Setter-Injektion benötigt keinen Standardwert, daher kann Ihr Objekt null lauten.

Persönlich bin ich kein Fan von Umgebungskontext. Allerdings würde ich es verwenden, wenn es sich um die akzeptabelste Lösung handelt. Im Falle Ihrer Implementierungen würde ich so etwas tun: weil Sie Objekte initialisieren müssen, die die zwei Schnittstellen nur einmal und an einem Ort implementieren, könnten Sie mit dem Umgebungskontext beginnen. Wenn Sie feststellen, dass Sie es an einer sehr kleinen Anzahl von Orten verwenden, denken Sie darüber nach, es als Setter-Injektion zu refaktorieren.Wenn die Existenz von Objekten wichtig ist, denken Sie an Konstruktor Injektion Implementierung.

+0

Warum magst du keinen Umgebungskontext? – Ziv