Ich schreibe gerade eine ASP.Net App von der Benutzeroberfläche aus. Ich implementiere eine MVP-Architektur, weil ich Winforms satt habe und etwas wollte, das eine bessere Trennung von Bedenken bietet.Wie kommuniziere ich Service Layer Meldungen/Fehler zu höheren Schichten mit MVP?
Mit MVP behandelt der Presenter Ereignisse, die von der Ansicht ausgelöst werden. Hier einige Code, den ich an der richtigen Stelle mit der Schaffung von Benutzern zu beschäftigen:
public class CreateMemberPresenter
{
private ICreateMemberView view;
private IMemberTasks tasks;
public CreateMemberPresenter(ICreateMemberView view)
: this(view, new StubMemberTasks())
{
}
public CreateMemberPresenter(ICreateMemberView view, IMemberTasks tasks)
{
this.view = view;
this.tasks = tasks;
HookupEventHandlersTo(view);
}
private void HookupEventHandlersTo(ICreateMemberView view)
{
view.CreateMember += delegate { CreateMember(); };
}
private void CreateMember()
{
if (!view.IsValid)
return;
try
{
int newUserId;
tasks.CreateMember(view.NewMember, out newUserId);
view.NewUserCode = newUserId;
view.Notify(new NotificationDTO() { Type = NotificationType.Success });
}
catch(Exception e)
{
this.LogA().Message(string.Format("Error Creating User: {0}", e.Message));
view.Notify(new NotificationDTO() { Type = NotificationType.Failure, Message = "There was an error creating a new member" });
}
}
}
ich meine Haupt-Formularvalidierung haben getan mit dem eingebauten in .Net Validation Controls, aber jetzt muss ich überprüfen, ob die Daten ausreichend erfüllt die Kriterien für die Serviceebene.
Sagen wir folgende Service Layer-Meldungen auftauchen können:
- E-Mail-Konto bereits vorhanden ist (Fehler)
- verweis Benutzer existiert nicht eingegeben (Fehler)
- Kennwortlänge überschreitet Datenspeicher erlaubt Länge (Fehler)
- Mitglied erfolgreich erstellt (Erfolg)
Lassen Sie uns auch sagen, dass m Orga-Regeln befinden sich in der Service-Schicht, die die Benutzeroberfläche nicht vorhersehen kann.
Derzeit habe ich die Service-Schicht eine Ausnahme werfen, wenn die Dinge nicht wie geplant ablaufen. Ist das eine ausreichende Strategie? Riecht dieser Code für euch? Wenn ich eine solche Service-Schicht schreiben würde, wäre es ärgerlich, Presenter schreiben zu müssen, die sie auf diese Weise benutzen? Rückkehrcodes scheinen zu alt zu sein und ein Bool ist einfach nicht informativ genug.
Bearbeiten nicht durch OP: Zusammenführung in nachfolgende Kommentare, die als Antworten des OP gebucht wurden
Cheekysoft, ich mag das Konzept eines ServiceLayerException. Ich habe bereits ein globales Ausnahmemodul für die Ausnahmen, die ich nicht erwarte. Finden Sie all diese benutzerdefinierten Ausnahmen mühsam? Ich dachte, dass das Auffangen der Basis-Exception-Klasse ein bisschen stinkend war, aber ich wusste nicht genau, wie es weiterging.
tgmdbm, Ich mag die clevere Verwendung der Lambda-Ausdruck dort!
Danke Cheekysoft für das Follow-up. Ich nehme an, das wäre die Strategie, wenn es Ihnen nichts ausmacht, wenn der Benutzer eine separate Seite anzeigt (ich bin hauptsächlich ein Webentwickler), wenn die Ausnahme nicht behandelt wird.
Wenn ich jedoch die Fehlermeldung in derselben Ansicht zurückgeben möchte, in der der Benutzer die Daten gesendet hat, die den Fehler verursacht haben, müsste ich dann die Ausnahme im Presenter abfangen?
Hier ist, was die CreateUserView aussieht, wenn der Moderator die ServiceLayerException behandelt hat:
Für diese Art von Fehler, es ist schön, es zu der gleichen Ansicht zu melden.
Wie auch immer, ich denke, wir gehen jetzt über den Rahmen meiner ursprünglichen Frage hinaus. Ich spiele mit dem, was du gepostet hast, und wenn ich weitere Details benötige, werde ich eine neue Frage stellen.
Was für eine nette Antwort :) – Mik378