2017-02-02 3 views
0

Ich habe die folgende Factory-Methode, die einfach die richtige IDatabase-Implementierung zurückgibt. Ich würde dies gern in meinen SimpleInjector-Container umwandeln, aber ich bin mir nicht sicher, wie.Wie man diese Fabrikmethode umgestaltet?

public class DALFactory 
    { 
     public static IDatabase GetDAL() 
     { 
      string asm = "SQL"; /* Hardcoded choice of DAL */ 
      if (asm == "XML") 
       return new XmlDatabase(); 
      if (asm == "SQL") 
       return new SqlDatabase(); 
      return null; 
     } 
    } 

Ich habe versucht zu verstehen, wie ich eine Sammlung registrieren kann, aber wie soll ich sagen SimpleInjector die man verwenden, wenn für eine Instanz von IDatabase in meinem Programm zu fragen? Offen für irgendwelche Ideen. Nur ein theoretisches Programm, das ich für die Praxis umgestalten möchte. Mit DI (IoC) war es zum ersten Mal ein so angenehmes, augenöffnendes Erlebnis!

Ich habe versucht, dies zu tun, bin ich in der Nähe?

Container.RegisterCollection<IDatabase>(new [] { typeof(SqlDatabase), typeof(XmlDatabase)}); 
Container.Register<IDatabase, XmlDatabase>(Lifestyle.Singleton); 
Container.Register<IDatabase, SqlDatabase>(Lifestyle.Singleton); 

Antwort

1

Bei dem asm Wert ist entweder hart codierte, oder basierend auf einem Wert in der Konfigurationsdatei, die Sie im Grunde sagen, dass eine laufende Anwendung nur eine bestimmte Version von IDatabase hat. Diese

bedeutet, dass Sie als solche registrieren sollten:

string asm = "SQL"; /* Hardcoded choice of DAL */ 
if (asm == "XML") 
    container.Register<IDatabase, XmlDatabase>(); 
if (asm == "SQL") 
    container.Register<IDatabase, SqlDatabase>(); 
+0

Sorry, ich bin so ein Neuling. Ich registriere eine Menge Sachen in meiner Containerklasse, aber habe vergessen zu erkennen, dass ich tatsächlich in einer C# -Klasse bin und nicht nur auf meine Container-Bibliotheken-Methoden beschränkt bin, sondern ich kann auch meine eigene Logik einfügen. Die Antwort ist so einfach, ich fühle mich jetzt so dumm. Vielen Dank!!! – Amivit

+0

Wenn ich es testbarer machen wollte, welche alternative Lösung könnten Sie anstelle dieser hässlichen Festcodierung empfehlen? Also könnte IDatabase auch eine Scheinimplementierung sein. Fügen Sie einfach eine dritte Option zu meiner hardcoded if-Schleife hinzu, oder gibt es einen besseren Ansatz? – Amivit

+0

@Amivit Ehen es kommt zu Unit-Tests, die Antwort ist völlig anders. Für Komponententests verwenden Sie überhaupt keinen Container **. Sie bauen die Klasse auf, um sie von Hand zu testen. – Steven

Verwandte Themen