Wir erstellen eine ASP.NET MVC-Site, und ich habe Schwierigkeiten, eine Verbindung zu definieren, um Unit-Tests am besten zu aktivieren (ich verwende 'Verbindung' generisch - es könnte eine Sitzung, eine Verbindung, ein Adapter oder irgendetwas sein anderer Typ von Datenkontext, der Transaktionen und Datenbankoperationen verwalten kann).Wo den Datenkontext (Adapter, Verbindung, Sitzung usw.) in MVC instanziieren?
Lassen Sie uns sagen, wir haben drei Klassen:
UserController
UserService
UserRepository
In der Vergangenheit würden wir so etwas wie dies in einem Verfahren der Userservice tun:
Using (ISomeSession session = new SomeSession())
{
session.StartTransaction();
IUserRepository rep = new UserRepository(session);
rep.DoSomething();
rep.Save();
session.Commit();
}
Allerdings war es nicht wirklich Möglich, Unit-Test, da die Abhängigkeit von SomeSession wurde nicht injiziert. Wenn wir jedoch D.I. Um die Abhängigkeit in den UserService zu injizieren, bleibt die Sitzung für die Lebensdauer des UserService hängen. Wenn es mehrere Dienste gibt, die vom UserController aus aufgerufen werden, kann jede Sitzung nur herumhängen, bis der UserController eine Garbage Collection durchführt.
Irgendwelche Gedanken, wie Sie das besser bewältigen können? Fehle ich etwas Offensichtliches?
bearbeiten
Sorry, wenn ich nicht klar war - Ich verstehe, dass ich Dependency Injection mit der Session/Datenkontext verwenden können, aber dann ist es über das Leben der Service-Klasse gehalten wird. Für länger laufende Aktionen/Methoden (d. H., Der Dienst wird durch einen Batch-Prozess aufgerufen), könnte dies zu vielen offenen Sitzungen führen, ohne dass ein anderer Grund als die Testbarkeit hinzugefügt wird.
Wenn Sie mit einer echten Verbindung testen, werden keine Komponententests, sondern Integrationstests durchgeführt. – RichardOD
Richard - das verstehe ich.Mein Punkt war, dass ich nicht wissen würde, wie man die Abhängigkeit auf die Klassenebene verschiebt, ohne die Verbindung während der gesamten Lebensdauer der Klasse am Leben zu halten (oder zumindest im Kontext aktiv) und nicht für eine kurze Zeit in der Using-Anweisung . Der Block "Verwenden" scheint viel sicherer zu sein, da er die Verbindung bei Bedarf öffnet und nach Abschluss schließt. –