ASP.NET MVC Controller-Eigenschaft in Service-Layer-Abhängigkeit einspeisen?

9

Ich verwende einen ähnlichen Ansatz wie in diesem ASP.NET MVC-Lernprogramm , wo Sie einen Wrapper um die ModelState -Sammlung eines Controllers in eine Validierungsklasse übergeben, damit der Controller auf Fehlerinformationen zugreifen kann.

Hier ist ein Kochbeispiel:

%Vor%

Mit dem Schloss Windsor Container für IoC / DI, wie erstelle ich IProductService ? Normalerweise hätte ich:

%Vor%

Dies ist jedoch nicht in der Lage, den Wert der Eigenschaft ModelState des Controllers in den Konstruktor für ProductValidator zu injizieren. Ich könnte das unter Verwendung von Konstruktorparametern anschließen, aber das scheint wirklich hässlich zu sein.

    
user403830 06.10.2010, 14:26
quelle

1 Antwort

2

Ich nehme an, Sie möchten, dass der modelstate übergeben wird, um automatisch Fehler in Ihr Modell zu injizieren? IMHO, ModelState sollte bleiben, wo es ist, und Sie bringen die Validierungsfehler dazu. So behandle ich zum Beispiel Fehler. Ich sage nicht, dass dies der beste Weg oder der einzige Weg ist, aber es ist ein Weg, auf dem Ihre Validierungsschicht nicht wissen muss, wer oder was Validierungsfehler verbraucht.

Zuerst verwende ich in meinem poco System.ComponentModel.DataAnnotations für Validierungsregeln. Hier ist zum Beispiel meine Account-Klasse.

%Vor%

Da ich die Validierung selbst initiieren möchte (außerhalb von MVC, wenn ich es selbst mache), musste ich meinen eigenen Validator implementieren.

%Vor%

Hier ist das ValidationResult, das ich zurück gebe

%Vor%

ErrorInfo ist eine sehr einfache Klasse mit Informationen zu meinem Fehler

%Vor%

Um diese Validierung mit meinen poco-Klassen ganz nett und ordentlich zu verpacken, erben wir von einer Basisklasse. Für die Validierung, um es generisch zu machen, wo das geerbte Kind der Basisklasse seinen Typ mitteilen muss. Es fühlt sich kreisförmig an, aber es funktioniert.

%Vor%

Und schließlich, wie Sie sehen können, löst meine Validierung eine RulesException aus. Diese Klasse ist ein Wrapper für alle Fehler.

%Vor%

Also, mit dem gesagt, meine Validierung in meinem Controller sieht eher so aus

%Vor%

ModelState.AddModelStateErrors (ex); ist eine Erweiterungsmethode, die ich geschrieben habe. es ist sehr einfach.

%Vor%

Auf diese Weise kann ich DI weiterhin für meine Dienste / Repositories verwenden und sie einen Fehler ausgeben lassen, wenn mein Modell ungültig ist. Dann lasse ich das Frontend - egal ob MVC-App, Web-Service oder Windows-App - entscheiden, was mit diesen Fehlern geschehen soll.

Ich denke, dass das Injizieren des MVC-Controllers / -Modells / -Sicht in das Modell / Dienste / Repositories / etc eine Verletzung der grundlegenden Trennung zwischen den Layern darstellt.

    
Josh 28.10.2010 14:18
quelle