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