Bei dieser Frage geht es darum, Regeln meiner Bewerbung anzuwenden, die mich verwirren.
Mein Controller verwendet den Dienst und der Dienst verwendet das Repository.
public class CommentController: ApiController{
[HttpPost]
public bool EditComment(Comment comment){
commentService.Update(comment);
}
}
public class CommentService{
ICommentRepository repository;
....
....
public void Update(Comment comment){
repository.Update(comment);
}
}
Wenn der Benutzer authentifiziert ist, kann er einen Kommentar aktualisieren.
Ein Benutzer sollte jedoch eigene Kommentare bearbeiten.
Ein Administrator kann jedoch alle Kommentare bearbeiten.
Ein Kommentar kann jedoch nach einem bestimmten Datum nicht mehr bearbeitet werden.
Von einer Abteilung bearbeiten
Und ich habe so etwas wie diese Regeln.
Wenn ich die Regel "Benutzer bearbeitet eigenen Kommentar" in der Serviceschicht anwende, ändere ich die Aktualisierungsmethode und übergebe den Parameter des Controllers User.Identity.Name,
public class CommentService{
ICommentRepository repository;
....
....
public void Update(string updatedByThisUser, Comment comment){
// if updatedByThisUser is owner of comment
repository.Update(comment);
}
}
Aber ändert sich der Servicebetrieb tatsächlich nach Regeln?
Ich bin etwas verwirrt darüber, wo ich die Regeln anwenden kann. Im Controller oder im Service oder im Repository.
Gibt es eine Standardmethode, um dies wie Designmuster zu tun?
[Authorize(Roles="member, admin")]
und jetzt sind alle Aktionsmethoden im Controller nur für Benutzer in der Rolle "Mitglied" oder "Administrator" zugänglich.Antworten:
Ich würde
isUserAllowedTo(user, PermissionService.Permissiontype.Update, PermissionService.Topic.COMMENT, additionalContextRelevantParameters)
PermissionService
Methoden in der Steuerung auf, in der die erforderlichen Kontextinformationen (dh aus der Sitzung) verfügbar sind.Sie können Ihre Architektur so gestalten, dass der Berechtigungsdienst im CommentService aufgerufen wird. Ich würde dies jedoch nicht empfehlen, da dies dem Dienst (dh der Sitzung) zusätzliche Abhängigkeiten hinzufügen würde, die das Testen des Dienstes durch Einheiten wesentlich schwieriger machen
quelle
Nehmen Sie sich zunächst etwas Zeit, um zu überlegen, wofür der Kommentarservice tatsächlich verantwortlich ist. Dies hängt von Ihren spezifischen Anforderungen und möglicherweise sogar von Ihrem eigenen Urteilsvermögen ab.
Wenn die Verantwortung des Kommentardienstes auf die Aktualisierung eines bestimmten Kommentars beschränkt ist , ist das, was Sie geschrieben haben, gut. In diesem Fall müssen Sie eine andere bedingte Logik berücksichtigen, um zu überprüfen, ob ein bestimmter Kommentar aktualisiert werden kann. Sie werden dies wahrscheinlich in der Steuerung tun, oder Sie können ein separates Subsystem erstellen, um zu überprüfen, ob ein Benutzer einen Kommentar veröffentlichen kann. Sie können dies genauso wiederverwenden, wie Sie den Kommentarservice wiederverwenden möchten.
Wenn der Kommentardienst für die Aktualisierung der Kommentare eines Benutzers verantwortlich ist , wird Ihr Dienst zu Aktualisieren (Benutzerbenutzer, Kommentarkommentar) und Sie haben die Flexibilität, Geschäftsregeln innerhalb des Dienstes selbst zu überprüfen.
Nachdem Sie sich über Ihre Entwurfsabsichten im Klaren sind, haben Sie Klarheit darüber, wie Sie Ihre Lösung implementieren können.
quelle