Frage

Das Projekt arbeite ich n-Tier-Architektur verwendet. Unsere Schichten sind wie folgt:

  • Data Access
  • Business Logic
  • Wirtschaftseinheiten
  • Präsentation

Die Business-Logik ruft nach unten in die Datenzugriffsschicht und die Präsentationsschicht ruft nach unten in die Business-Logik-Schicht und die Geschäftseinheiten werden von allen von ihnen verwiesen.

Unsere Geschäftseinheiten im Wesentlichen unseres Datenmodell 1-1 entsprechen. Für jede Tabelle, haben wir eine Klasse. Am Anfang, wenn der Rahmen entwickelt wurde, gab es keine Gegenleistung für die Verwaltung von Master-Detail oder Eltern-Kind-Beziehungen. Also alles von der Business-Logik, Datenzugriff und Geschäftseinheiten, bezogen nur eine einzige Tabelle in der Datenbank. Einmal haben wir begonnen, die Anwendung zu entwickeln schnell klar wurde, dass nicht diese Beziehungen in unserem Objektmodell mit stark uns verletzt war.

Alle Ihre Schichten (einschließlich der Datenbank) werden alle generierten von einer in-house-Metadaten-Datenbank, die wir verwenden, um unsere home-grown-Code-Generator antreiben.

Die Frage ist, was der beste Weg ist, die Beziehungen in unseren Einrichtungen zu laden oder zu faul Last. Zum Beispiel Lassen Sie sich sagen, dass wir eine Person Klasse, die eine Master-Kind-Beziehung zu einer Adresstabelle hat. Dies zeigt sich in der Geschäftseinheit als Sammel Eigentum von Adressen auf dem Objekt Person nach oben. Wenn wir eine Eins-zu-Eins-Beziehung haben, dann würde dies als eine einzige Einheit Eigenschaft zeigen. Was ist der beste Ansatz für die Füllung und die Beziehung Objekte zu speichern? Unsere Geschäftseinheiten haben keine Kenntnis von der Business-Logik-Schicht, so kann es nicht intern, wenn die Eigenschaft get der gerufenen erfolgen.

Ich bin sicher, dass es irgendeine Art von Standard-Rüttler ist da draußen, dies zu tun. Irgendwelche Vorschläge?

Auch ein Nachteil ist, dass die DataAcess Schicht verwendet Reflektion unserer Einheiten zu bauen. Die gespeicherten Prozeduren geben ein Ergebnis selt basierend auf einer Tabelle, und mithilfe von Reflektion füllen wir unser Business-Objekt, indem Sie die Namen der Eigenschaften mit den Namen der Spalten übereinstimmen. So schließt sich dabei wäre schwierig.

War es hilfreich?

Lösung

Ich empfehle bei Fowler Patterns of Enterprise Architecture Buch. Es gibt ein paar verschiedenen Ansätze, um diese Art von Problem zu lösen, dass er gut skizziert, einschließlich Entitätsbeziehungen.

Eine der zwingenden Elemente würde die Einheit des Arbeitsmuster sein, die im Grunde ist ein Sammler, der die Aktionen auf Ihrem Einheiten durchgeführt beobachtet, und wenn Sie fertig sind mit Ihrer Aktion, Chargen sie die entsprechenden Datenbankgespräche und macht die fordern in die Datenbank. Dieses Muster ist eines der zentralen Konzepte verwendet von NHibernate , die ein Objekt verwendet, die implementiert IDisposable zu signalisiert das Ende der „Arbeit“. Auf diese Weise können Sie Ihre Aktionen in einer Verwendung wickeln und die Arbeitseinheit befassen sich mit den Aktionen für Sie haben.

Edit: Weitere Informationen

Diese ist ein Link zu der Basisklasse Struktur der Einheit der Arbeits ... nicht wirklich die aufregendste Sache der Welt. Fowler bietet mehr Details in seinem Buch, von denen einige Sie hier . Sie können auch von NHibernate als eine mögliche Implementierung im Session-Objekt aussehen (ich war in der Lage, die ISession Schnittstelle ... nicht sicher, wo die Umsetzung Leben)

Hope, das hilft.

Andere Tipps

Ein Ansatz, den ich in der Vergangenheit verwendet habe, ist den Containertyp intelligent genug, um die gewünschten Objekte zu holen. zB:

public class Relation<T>
{
  private T _value;

  private void FetchData()
  {
    if( LoadData != null ) {
      LoadDataEventArgs args = new LoadDataEventArgs(typeof(T), /* magic to get correct object */);
      LoadData(this, args);
      _value = (T)args.Value;
    }
  }

  public event EventHandler<LoadDataEventArgs> LoadData;

  public T Value {
    get {
      if( _value == default(T) )
        FetchData();
      return _value; 
    }
    set { /* Do magic here. */ }
  }
}

Dann erklären Sie es auf Ihrem Unternehmen wie:

[RelationCriteria("ID", EqualsMyProperty="AddressID")]
public Relation<Address> Address {
  get; set;
}

Und es ist bis zu dem Lader von der Art, die die Eigenschaft Adresse deklariert einen Handler zum Loaddata Ereignisse hinzuzufügen.

Eine ähnliche Klasse implementiert IList, um Ihnen eine Eins-zu-viele-Beziehung.

Welche Sprache verwenden Sie? Was Sie beschrieben ist genau das, was das Entity Framework macht in .Net. Aber du hast nicht geteilt, welche Sprache Sie wurden mit und ich nehme an, Sie nicht alle Ihre Datalayer neu schreiben möchten.

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