Frage

Wenn Sie zum Beispiel eine Datenbanktabelle namens Person (ID, Name usw.), welche Art von Objekt sollte die Datenzugriffs Tier Rückkehr in das Business-Tiere? Ich denke, so etwas wie folgt aus:

//data access tier
public class DataAccess{

   public interface IPerson{
      int ID{ get; set; }
      string Name{ get; set; }
   }

   internal class Person : IPerson{
      private int id;
      private string name;

      public int ID{ get{return id; } set{ id=value; } }
      public int Name{ get{retutn name; } set{ name=value; }
   }

   public static IPerson GetPerson(int personId)
   {
      //get person record from db, populate Person object
      return person;  
   }
}

//business tier
public class Person : IPerson{
   private int id;
   private string name;

   public int ID{ get{return id;} set{id=value;} }
   public string Name{ get{return name;} set{name=value;} }

   public void Populate(int personId){
      IPerson temp = DataAccess.GetPerson(personId);
      this.ID = temp.ID;
      this.Name = temp.Name;
   }
}

Aber das alles scheint ein wenig umständlich? Gibt es eine elegantere Lösung für dieses Problem? Soll ich eine DataRow von der Datenzugriffsschicht auf die Business-Schicht zurückkehren statt?

War es hilfreich?

Lösung

Sie brauchen nicht die Klassendefinition in Ihrer Datenzugriffsschicht (DAL) zu wiederholen.

Sie können Ihre Geschäftseinheiten als ‚dumm‘ Container in einer separaten Assembly erstellen, zum Beispiel Ihre Klasse Person kann nur sein: -

public class Person
{
    int ID { get; set: }
    string Name { get; set: }
}

Dann können Sie Ihre DAL einen Verweis auf die Geschäftseinheiten Schicht geben. Ihre Controller-Objekte, ob sie in einer separaten Business-Logik-Schicht, oder in Ihrer UI-Schicht können dann rufen Sie einfach die DAL, die eine Geschäftseinheit erstellen, füllen Sie es aus der Datenbank und senden es an der Steuerung.

Dieser Artikel von Imar Spaanjaars hat eine schöne Erklärung für dieses Muster.

Andere Tipps

Ihre Business-Schicht ist auf jeden Fall will nicht um Datenzeilen kennen - versuchen, Daten bestimmte Klassen in der Datenschicht zu verlassen. Dies reduziert Kopplung und befreien Sie Ihre Persistenz-Schicht zu einem späteren Zeitpunkt ohne Großhandel Neugestaltung der Architektur zu ändern.

Ihr spezielles Problem zu lösen, können Sie entweder:

  • Erstellen Sie grundlegenden Datenobjekte / Entitäten in Ihrer Datenschicht und gibt sie für den Verbrauch auf Ihre Business-Schicht aus.
  • Oder, wie es Ihnen tun scheint, erstellen DTOs (Data Transfer Objects), die rein als Mittel existiert von Daten aus der Datenschicht zu einer reicheren Umsetzung Ihres Geschäftsobjekts in einer höheren Schicht übertragen. Sie könnten dies in einem reichen Domain-Modell eines Repository-Muster als Teil tun.

Das andere, was Sie darüber nachdenken, vielleicht wollen Ebenen v Schichten - es macht einen Unterschied, wie Sie über diese Dinge nachzudenken. Tiers ist in der Regel physisch, in anderen Worten, sie die Grenzen zwischen Prozessen festlegen. Die Schichten sind in der Regel logisch, sie trennen, um eine Funktionalität des Programms in lose gekoppelten Einheiten. Sie streben Schichten in diesem Fall.

Wenn Sie Schnittstellen zu Ihren DAO-Klassen erstellen und legen Sie sie in Ihrem Business-Tiere, können Sie Ihr Business-Tier aus dem Data Access Tiere verweisen. Die DAO-Klassen in der Datenebene Rendite-Objekte aus dem Business-Tiere.

Ihr Business-Tier verweist auf die Schnittstellen, anstatt die Datenzugriffsobjekte direkt referenzieren. Dependency Injection über einen IoC-Container (wie Schloss Windsor zum Beispiel) ermöglicht es Ihnen, dies zu erreichen.

Diese Technik wird getrennt Schnittstelle genannt und ist hier beschrieben:

http://www.martinfowler.com/eaaCatalog/separatedInterface.html

Die beste Erklärung für diese Technik, die ich gesehen habe kann durch Billy McCafferty in diesem Artikel auf NHibernate Best Practices, geschrieben gefunden werden.

http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx

Der Artikel hat eine Menge Informationen, die NHiberbate spezifisch ist, aber gut die Hälfte davon ist nur solide Informationsanwendungen auf der Gestaltung locker und leicht getestet Einheit gekoppelt werden.

Wie diese Regel, die jede Schicht müssen lose gekoppelt obere Schicht, das Hinzufügen BL Bezugs auf DAL ist nicht gute Idee. Sein besseres Datenmodell in DAL mit einer Schnittstelle definieren und Geschäftsentitätskomponenten Form in BL machen. wie meine Erfahrungen, ist es besser, mit Repository in DAL und Zugriff in Ihrer Geschäftseinheit oder Business Process.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top