Repository-Muster - Warum genau brauchen wir Schnittstellen?
Habe ich gelesen, aus dem internet habe ich diese Punkte, die sagt-Schnittstellen verwendet wird, für diese
- Verwenden TDD-Methoden
- Ersetzen Persistenz-engine
Aber ich bin nicht in der Lage zu verstehen, wie die Schnittstelle wird sinnvoll sein, zu diesem Punkt Replace persistance engine
.
betrachten wir ich bin die Erstellung einer einfachen(ohne generics) - repository für EmployeeRepository
public class EmployeeRepository
{
public employee[] GetAll()
{
//here I'll return from dbContext or ObjectContex class
}
}
So, wie Schnittstellen kommen ins Bild?
und wenn nehme ich ein interface geschaffen, warum upcasting verwendet wird ? für e.g
IEmployee emp = new EmployeeRepository() ;
vs
EmployeeRepository emp = new EmployeeRepository();
Bitte erklären Sie mir genau und auch andere Nützlichkeit der Schnittstelle in Bezug auf die Repository-Pattern.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie diese:
und dann könnten Sie haben, wie viele Implementierungen, wie Sie möchten:
Wie Sie sehen können ist es nicht wirklich wichtig, wie implementieren wir das repository. Was wichtig ist, dass allen Repositorys und-Implementationen hinsichtlich der definierten Vertrag (interface) und alle besitzen ein
GetAll
Methode der Rückkehr eine Liste der Mitarbeiter.Werden und dann haben Sie eine Steuerung, die diese Schnittstelle benutzt.
Sehen, wie sich der controller nicht mehr abhängig von einer bestimmten Implementierung der repository? Alle, die es wissen muss, ist, dass die Umsetzung dieser Hinsicht den Vertrag. Jetzt alles, was Sie tun müssen ist, konfigurieren Sie Ihre Lieblings-dependency injection-framework zu verwenden, die Implementierung, die Sie wünschen.
Hier ist ein Beispiel, wie dies mit Ninject:
In der generierten
~/App_Start/NinjectWebCommon.cs
code, den Sie einfach entscheiden, um die EF-Implementierung mit einer einzigen code-Zeile:Diese Weise müssen Sie nicht mehr tun müssen keine manuellen Umschreibungen diejenigen repository-Klassen und sorgen machen upcasting oder was auch immer. Es ist das dependency-injection-framework verwaltet diese für Sie und kümmern sich um die Injektion der angegebenen Implementierung in das controller-Konstruktor.
Und einfach durch änderung dieser Konfiguration konnten Sie schalten Sie Ihr Daten-access-Technologie, ohne Sie zu berühren eine einzige Zeile code im controller. Das ist, wie unit-Tests in isolation kommt auch ins Spiel. Da Ihr controller-code ist jetzt schwach gekoppelt sind, um das repository (Dank der Schnittstelle, die wir eingeführt) alles, was Sie tun müssen, um in den unit-test ist einigen mock-Implementierung auf das repository, das können Sie definieren Ihr Verhalten. Dies gibt Ihnen die Möglichkeit, unit-Tests der Index-controller-action ohne Abhängigkeit von einer Datenbank oder was auch immer. Komplette isolation.
Ich auch Sie einladen, an der Kasse des folgende Artikel über TDD und DI in ASP.NET MVC.
EmployeeRepositoryEF
in meinem dependency injection-framework, mein controller wird das konsumierenEmployeeRepositoryEF
, aber was ist, wenn ich möchte, konsumieren 2 Umsetzung in den gleichen controller.. wenn diese Frage dumm, es tut mir sehr Leid..IEmployeeRepository
Instanz in seinem Konstruktor. Nur eine einzige Umsetzung weitergegeben werden konnten. Auf der anderen Seite hätte man einen anderen controller, die vielleicht eine andere Implementierung der Schnittstelle. Das ist durchaus möglich. Sie müssen nur die Konfiguration Ihres DI-framework, so dass es spritzt ImplementationA in ControllerA und ImplementationB in ControllerB. Die syntax variiert natürlich zwischen den verschiedenen DI-frameworks.Würden Sie, setzen Sie Ihr repository als Schnittstelle:
Dies würde es ermöglichen, dass Sie viele verschiedene Implementierungen der Benutzeroberfläche, wie der Standard ein:
Oder ein test einer:
Ihren code verbraucht das repository wird dann nur Interesse an der Verwendung der Schnittstelle:
Die geheime Zutat ist die Fabrik, oder einem anderen Mechanismus zur Lösung der Schnittstelle in eine verwendbare Art (ein Dependency Injection framework wie z.B. Ninject oder Schloss Windsor wird diese Aufgabe erfüllt).
Der Punkt ist, die Konsum-code kümmert sich nicht um die Umsetzung, nur die Vertrag (die Schnittstelle). Dadurch können Sie die swap-Implementierungen für Testzwecke sehr leicht und fördert eine lose Kopplung.
Nur zur Klarstellung, es gibt keine Verbindung zwischen der Verwendung von Schnittstellen und die repository-Muster speziell, es ist nur ein anderes Muster, kann von Ihnen Gebrauch machen.
IEmployee emp = new EmployeeRepository() ;
vsEmployeeRepository emp = new EmployeeRepository();
??