2 Stimmen

Was ist die beste Praxis für einen Dienstschichtentwurf, bei dem die Geschäftsdaten eine 1 zu 0..1 Beziehung haben?

Ich grüße alle,

Ich habe recherchiert und fand eine Reihe von Diskussionen über die Gestaltung eines MVC-Service-Schicht, aber ich habe nicht eine Antwort auf meine genauen Fragen gefunden. Der Beitrag auf Interdependenz der Dienstebenen hat ein Bild, das veranschaulicht, was mir vorschwebt, aber ich habe eine weitere Frage, die meines Erachtens in dem zitierten Beitrag nicht behandelt wird.

Meine Anwendung wird Daten für eine gemeinnützige Organisation verfolgen, die mit Menschen in verschiedenen Kontexten interagiert. Vielleicht war der Mensch ein Kunde, vielleicht war er ein Berater oder vielleicht war er ein Widersacher. Es können mehrere sein. Ein Kunde kann später zu einem Gegner werden (denken Sie an die Kunden von Anwälten).

Meine Idee ist, dass die Erstellung eines neuen Kunden oder eines neuen Gegners immer zwei Datensätze erzeugt: Ein Datensatz in der Personentabelle und ein Datensatz in der Zusatztabelle. Mein Gedanke dahinter ist, dass es einen Ort (die Personentabelle) gibt, an dem überprüft werden kann, ob das Unternehmen in der Vergangenheit eine Interaktion mit einer bestimmten Person hatte.

Meine Frage ist, wenn Entitäten in einer 1 zu 0..1 Beziehung zur Steuerungsebene dargestellt werden, (1) Sollte der Controller an der Kombination und Aufteilung von Klassen beteiligt sein, bevor er sie an einen View weitergibt? (2) Wenn nicht, sollte die Serviceschicht das Viewmodel konstruieren?

Ich habe den Beitrag über die Linie 1800 Controller gelesen. aquí . Ich habe auch gelesen diese Stelle die sagt, dass Ihre Service-Schicht nicht über das Ansichtsmodell wissen sollte, was mich denken lässt, es lebt und stirbt in der Controller-Schicht. Wenn die Service-Schicht nicht berühren das Viewmodel, zum Beispiel, (3) ist es ein gutes Design für die workerService um beides zurückzugeben Person et Worker Objekte an den Controller?

Hier sind meine Entitätsklassen:

public class Record
{
    public DateTime datecreated { get; set; }
    public DateTime dateupdated { get; set; }
    public string Createdby { get; set; }
    public string Updatedby { get; set; }
}

public class Person : Record
{   
    public int ID { get; set; }
    public virtual Worker Worker { get; set; }
    publiv virtual Defendant defendant {get; set;}
    ...
}

public class Worker : Record
{
    public int ID { get; set; }
    public virtual Person person { get; set; }
    ...
}

public class Defendant : Record
{
    public int ID { get; set; }
    public virtual Person person { get; set; }
    ...
}

1voto

Sergi Papaseit Punkte 15714

Ich denke, Sie sollten versuchen, ein Gleichgewicht zu finden zwischen dem, was "gutes Design" ist, und dem, was für Sie funktioniert.

Ich habe zum Beispiel eine MVC-Anwendung, die Folgendes verwendet ASP.NET Membership aber ich habe auch eine benutzerdefinierte User Tabelle, in der ich Dinge wie den Freundesnamen eines Benutzers oder OpenID speichere. In der gleichen Anwendung habe ich eine IAdminService die alles rund um die Benutzerverwaltung regelt.
Was IAdminService an den Controller zurückgibt, ist eine AdminUser-Klasse, die wie folgt aussieht:

public class AdminUser
{
    public string UserName { get; set; }
    public User User { get; set; }
    public MembershipUserWrapper MembershipUser { get; set; }
}

MembershipUserWrapper ist nur ein Wrapper um den Standard MembershipUser um Tests und mehr Flexibilität im Allgemeinen zu ermöglichen.

Wie auch immer, man könnte argumentieren, dass AdminUser ist eigentlich ein Ansichtsmodell, und ich habe in der Tat ein paar Ansichten, die stark auf AdminUser . Es würde die Dinge unnötig verkomplizieren, wenn man nicht zuließe IAdminService ein zurückgeben AdminUser nur weil sie in der "Dienstschicht" liegt, und in diesem Fall wollen Sie nicht, dass der Controller die "Transformation" von User et MembershipUserWrapper a AdminUser jedes Mal.

Ist es ein gutes Design, wenn der workerService sowohl Person- als auch Worker-Objekte an den Controller zurückgibt?

Ich denke, in diesem Fall ist es wahrscheinlich so. Sie könnten zwei getrennte Dienste haben, aber der größte Teil der Logik zum Abrufen einer Worker und eine Person ist wahrscheinlich derselbe, so dass Sie gezwungen wären, entweder eine Menge Code zu wiederholen oder einen dritten Dienst zu erstellen, der die gemeinsamen Aufgaben ausführt.

Sie sollten auf eine angemessene Gestaltung achten, aber auch K.I.S.S. et YAGNI zu berücksichtigen. Tun Sie, was jetzt sinnvoll ist, und überarbeiten Sie bei Bedarf entsprechend.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X