Generisches Repository und gespeicherte Prozeduren verwenden

8

Ich arbeite an einer bestehenden Anwendung, die zuerst das generische Repomuster und die EF6-Datenbank verwendet. Ich rufe einen gespeicherten Prozess auf, der einen komplexen Typ zurückgibt, der keine vorhandene Entität in meinen Entitätsmodellen ist, und daher bin ich mir nicht sicher, welchen Typ ich geben soll.

So wird mein sp von meiner Serviceebene aus aufgerufen

%Vor%

Erstelle ich eine Entity in meiner Datenschicht, um sie zuzuordnen oder was ist der beste Ansatz für gespeicherte Prozeduren, die komplexe Typen zurückgeben? Wenn dies der Fall ist, ist ein benutzerdefiniertes Mapping erforderlich oder es ist nur ein Fall, die Entity-Klasse zu erstellen

danke

    
user2329438 15.01.2015, 22:20
quelle

4 Antworten

11

Wenn Sie eine Entität mit diesen Feldern haben, können Sie die SqlQuery-Methode wie oben gezeigt aufrufen, wenn nicht, dann empfehle ich, eine neue Klasse zu erstellen, um das Ergebnis zuzuordnen:

%Vor%

Ich weiß nicht, wie das UnitOfWork-Muster in Ihrem Fall implementiert wird, aber ich nehme an, dass Sie Zugriff auf Ihren Kontext haben. In Ihrer Klasse UnitOfWork könnten Sie eine generische Methode wie diese erstellen:

%Vor%

Auf diese Weise können Sie Ihre Store-Prozeduren wie unten gezeigt ausführen:

%Vor%     
octavioccl 15.01.2015, 23:29
quelle
8

Der Zweck des Repository-Patterns besteht darin, den Speicher & amp; Abrufen von Daten, um Ihren Client-Code z.B. Business-Schicht (Service-Schicht in Ihrem Fall) von nichts über die Art und Weise wissen müssen, wie Daten persistiert werden. SQL-Anweisungen würden beispielsweise nur in Ihren Repository-Klassen existieren und nicht in Ihrem gesamten Code.

Wenn Sie SQL, Stored Procedure-Namen und -Parameter Ihrem Client-Code zur Verfügung stellen, profitieren Sie nicht viel vom Repository-Muster, und wenn Sie es wirklich nennen, können Sie es gar nicht als Repository bezeichnen. Sie verlieren den Vorteil, dass Sie das Repository verspotten und Ihre Business-Schicht unabhängig von Ihrer Datenzugriffsebene testen können. Dies bedeutet, dass Integrationstests (die eine vollständige Datenbankinstanz erfordern) zur Überprüfung der Geschäftslogik erforderlich sind.

Erwägen Sie eine erneute Faktorisierung, sodass Sie eine CountryRepository-Klasse mit einer GetCountry-Methode (int CountryId, DateTime fromDate, DateTime toDate) haben, die eine Country-Entität oder eine ähnliche Entität zurückgibt. Ich denke, Sie werden zustimmen, dass die Lesbarkeit Ihres Codes im Vergleich zum Code in Ihrer Frage viel besser ist.

%Vor%

Client-Code wäre dann z.B.

%Vor%

Siehe auch diese SO-Frage

    
saille 16.01.2015 00:31
quelle
0

mein Weg

%Vor%

Die obige Methode funktioniert nicht in meinem Fall und ich schreibe oben und das ist für mich für jeden in meinem Fall gearbeitet

    
dewelloper 24.02.2017 13:12
quelle
0
%Vor%

Schnittstelle

%Vor%     
San Jaisy 15.12.2017 02:53
quelle