2017-07-15 4 views
0

Ich schreibe eine einfache Webanwendung und stieß auf ein Architekturproblem. Lassen Sie uns sagen, dass es eine Customer-Klasse in meiner BLL Schicht ist:Vermeidung von Abhängigkeiten zwischen Präsentationsschicht und DAL

public class Customer 
{ 
    public int Id { get; set; } 

    public Person PersonalData { get; set; } 

    public int? MaximalPrice { get; set; } 

    public string Note { get; set; } 

    public Customer() 
    { 
     PersonalData = new Person(); 
    } 
} 

I Erstellung von Daten dieser Klasse in zwei Phasen zu unterteilen werde. In der ersten Phase gibt der Benutzer grundlegende Informationen über den Kunden, die er später vervollständigen kann. Also habe ich zwei Ansichten in meiner Präsentationsebene erstellt. Eine, die nur grundlegende Informationen anzeigt, an zweiter Stelle für alle.

Basic:

<div class="input-field col s6"> 
     <i class="material-icons prefix">phone</i> 
     @Html.TextBoxFor(m => m.TelephoneNumber, new {id = "icon_telephone", mask = "telephoneNumber"}) 
     @Html.LabelFor(m => m.TelephoneNumber) 
    </div> 
    <div class="input-field col s6"> 
     <i class="material-icons prefix">credit_card</i> 
     @Html.TextBoxFor(m => m.MaximalPrice, new { id = "credit_card" }) 
     @Html.LabelFor(m => m.MaximalPrice) 
    </div> 
</div> 
<div class="row"> 
    <div class="input-field col s12"> 
     <i class="material-icons prefix">note</i> 
     @Html.TextBoxFor(m => m.Note, new { id = "note_add" }) 
     @Html.LabelFor(m => m.Note) 
    </div> 
</div> 

Full (Teil-Ansicht):

<div class="row"> 
    <div class="input-field col s6"> 
     @Html.TextBoxFor(m => m.FirstName) 
     @Html.LabelFor(m => m.FirstName) 
    </div> 
    <div class="input-field col s6"> 
     @Html.TextBoxFor(m => m.LastName) 
     @Html.LabelFor(m => m.LastName) 
    </div> 
</div> 
<div class="row"> 
    <div class="input-field col s6"> 
     @Html.TextBoxFor(m => m.Street) 
     @Html.LabelFor(m => m.Street) 
    </div> 
    <div class="input-field col s6"> 
     @Html.TextBoxFor(m => m.City) 
     @Html.LabelFor(m => m.City) 
    </div> 
</div> 
<div class="row"> 
    <div class="input-field col s6"> 
     @Html.TextBoxFor(m => m.BirthDate) 
     @Html.LabelFor(m => m.BirthDate) 
    </div> 
    <div class="input-field col s6"> 
     @Html.TextBoxFor(m => m.TelephoneNumber , new { mask = "telephoneNumber" }) 
     @Html.LabelFor(m => m.TelephoneNumber) 
    </div> 
</div> 

Jetzt habe ich eine Annahme gemacht, dass, wenn der Benutzer eine Basisversion von Kunden erstellen wird er nicht in der Lage sein wird, um es zu sehen Wenn er die Kundendaten vollständig ausgefüllt hat, kann er sie nicht mehr in der Grundkundenliste sehen. Um dies zu erreichen, betrachte ich zwei Lösungen.

  1. Erstellen einer Funktion in BLL, die über alle Eigenschaften meiner Klasse iterieren und prüfen wird, ob eine nicht grundlegende Eigenschaft vorhanden ist, die bereits nicht leer ist.
  2. DAL Domain des Kunden erweitern und Spalte hinzufügen, ob der Kunde ist „basic“ anzeigt oder „voll“

Aber keiner von oben genannten Lösungen sind perfekt. Erstens wird die Leistung in großen Datenmengen langsam sein, weil alle Eigenschaften aller Kundeneinträge durchlaufen werden. Es scheint also, dass dies vermieden werden sollte. Ich mag keine zweiten Optionen, das scheint dieses Problem zu lösen, weil es eine Abhängigkeit zwischen Präsentationsschicht und Datenzugriffsschicht erstellt. Ich finde, dass das Erstellen einer zusätzlichen Spalte in der Datenbank nur für Präsentationszwecke keine gute Idee ist.

Also, meine Frage ist: Gibt es bessere Alternativen? Was denkst du über diese Optionen? Wie würdest du dieses Problem lösen?

+1

Hinzufügen einer neuen Spalte in der Datenbank, um festzustellen, ob der Kunde grundlegend ist oder nicht, ist keine schlechte Idee. Dadurch können Sie solche Kunden auch an vielen anderen Orten wie Berichten filtern. Eine andere Möglichkeit besteht darin, basierend auf einer anderen Spalte zu filtern, die bestimmen kann, ob der Kunde grundlegend ist. Nehmen wir an, Firstname ist null für einen Basiskunden, aber für einen vollständigen Kunden ist es nie null.Alles in allem sollten Sie die Filterung von Kunden anhand einiger Kriterien durchführen, anstatt alle Eigenschaftswerte zu überprüfen. –

+0

Danke, ich denke, ich werde die zweite Option wählen. Was denkst du darüber, diese Logik in die grundlegende Kundenmodellansicht in der Präsentationsebene zu integrieren? –

+0

Sie sollten diese Logik in Repository-Ebene oder Datenzugriffsebene haben, wo Sie die Datensätze filtern. Sie sollten über separate Methoden verfügen, um grundlegende Kunden und vollständige Kunden abzurufen, und entsprechende Methoden aufrufen, um entsprechende Ansichtsmodelle zu füllen. –

Antwort

0
  1. DAL sollten Spalten der Lage sein, zu filtern, wie DAL.Custumers.Get(_columns_) und BLL entscheidet nach welchem ​​Typ Benutzer angemeldet.
0

Viewmodel Erstellen sowohl für die Grundform und die vollen bilden. Sagen Sie .. BasicInfoFormViewModel und FullInfoViewModel, wobei nur die Eigenschaften in ihrer spezifischen Form enthalten sind.

Wenn Sie die Formulare übermitteln, ordnen Sie die Daten des Ansichtsmodells in der Controller-Aktion der Customer-Klasse (oder der Klasse, die Sie als Entität verwenden) zu und speichern Sie die Entität.

Ich glaube nicht, dass Sie die Domäne erweitern müssen, um anzuzeigen, ob der Kunde grundlegend oder voll ist. Sie könnten einfach eine Service-Layer-Logik haben, die die Entität überprüft und den Basis-/Vollstatus bestimmt. Ihre Ansichten würden diese Bestimmung verwenden, um die erforderliche Form anzuzeigen.

Verwandte Themen