Frage

Sagen wir, ich habe eine 3-Tier-Architektur (UI, Wirtschaft und Daten). Normalerweise schaffe ich ein viertes Projekt mit dem Namen „Model“ oder „Common“ auf meine Datenzugriffsobjekte zu halten und jede der anderen Projekte würden dann dieses Projekt verwenden.

Jetzt an einem Projekt arbeite ich, wo einige meiner Datenzugriffsobjekte haben Methoden wie Save () usw., die den Zugriff auf die Daten Projekt benötigen. Also, ich würde einen zirkulären Verweis hat, wenn ich das Modell / Common Projekt im Data-Projekt zu verwenden versucht.

In diesem Szenario, wo ist der beste Ort, um die Datenzugriffsobjekte zu halten? Ich kann es im Data-Projekt halte selbst, aber dann die mein UI Projekt benötigt um die Datenzugriffsobjekte kennen, müßte die Datenschicht zugreifen, was nicht gut ist.

War es hilfreich?

Lösung

Das ist, was ich in meinem Projekt habe.

1.) Application.Infrastructure

  • Basisklassen für alle Business, Busines Objektsammlung, Datenzugriffsklassen und meine benutzerdefinierten Attribute und Dienstprogramme als Erweiterungsmethoden, Allgemein Validation Framework. Dies bestimmt Gesamtverhalten Organisation von meiner letzten .net-Anwendung.

2.) Application.DataModel

  • typisierten Dataset für die Datenbank.
  • Tableadapters erweiterte Transaktionen und andere Funktionen zu übernehmen wir müssen.

3.) Application.DataAccess

  • Datenzugriffsklassen.
  • Die tatsächliche Ort, an dem Datenbankaktion abgefragt wird mit zugrunde liegendem typisierten Dataset.

4.) Application.DomainObjects

  • Geschäftsobjekte und Geschäftsobjektsammlungen.
  • Aufzählungen.

5.) Application.BusinessLayer

  • Stellt Manager-Klassen zugänglich Darstellungsschicht.
  • Httphandlers.
  • Meine eigene Seite Basisklasse.
  • Mehr Dinge gehen hier ..

6.) Application.WebClient oder Application.WindowsClient

  • Meine Präsentationsschicht
  • nimmt Referenzen von Application.BusinessLayer und Application.BusinessObjects.

Application.BusinessObjects werden über die Anwendung verwendet und sie reisen quer durch alle Schichten, wenn neeeded [außer Application.DataModel und Application.Infrastructure]

Alle meine Fragen sind definiert nur Application.DataModel.

Application.DataAccess zurückkehren oder nimmt Geschäftsobjekte als Teil einer Datenzugriffsoperation. Business-Objekte werden mit Hilfe der Reflexion Attribute erstellt. Jedes Business-Objekt ist mit einer Attributzuordnung markiert Zieltabelle in der Datenbank und Eigenschaften innerhalb des Business-Objekts mit Attributen Mapping markiert coloumn in jeweiliger Datenbanktabelle zum Ziel.

Meine Validation Framework lässt mich jedes Feld mit Hilfe von benannten Validation validieren.

Meine framrwork stark nutzt Attribute die meisten der lästigen Aufgaben wie Mapping und Validierung zu automatisieren. Ich kann auch neue Funktion als neuer Aspekt im Rahmen.

Eine Probe Business-Objekt wie dies in meiner Anwendung aussehen würde.

User.cs

[TableMapping("Users")]
public class User : EntityBase
{
    #region Constructor(s)
    public AppUser()
    {
        BookCollection = new BookCollection();
    }
    #endregion

    #region Properties

    #region Default Properties - Direct Field Mapping using DataFieldMappingAttribute

    private System.Int32 _UserId;

    private System.String _FirstName;
    private System.String _LastName;
    private System.String _UserName;
    private System.Boolean _IsActive;

    [DataFieldMapping("UserID")]
    [DataObjectFieldAttribute(true, true, false)]
    [NotNullOrEmpty(Message = "UserID From Users Table Is Required.")]
    public override int Id
    {
        get
        {
            return _UserId;
        }
        set
        {
            _UserId = value;
        }
    }

    [DataFieldMapping("UserName")]
    [Searchable]
    [NotNullOrEmpty(Message = "Username Is Required.")]
    public string UserName
    {
        get
        {
            return _UserName;
        }
        set
        {
            _UserName = value;
        }
    }

    [DataFieldMapping("FirstName")]
    [Searchable]
    public string FirstName
    {
        get
        {
            return _FirstName;
        }
        set
        {
            _FirstName = value;
        }
    }

    [DataFieldMapping("LastName")]
    [Searchable]
    public string LastName
    {
        get
        {
            return _LastName;
        }
        set
        {
            _LastName = value;
        }
    }

    [DataFieldMapping("IsActive")]
    public bool IsActive
    {
        get
        {
            return _IsActive;
        }
        set
        {
            _IsActive = value;
        }
    }

    #region One-To-Many Mappings
    public BookCollection Books { get; set; }

    #endregion

    #region Derived Properties
    public string FullName { get { return this.FirstName + " " + this.LastName; } }

    #endregion

    #endregion

    public override bool Validate()
    {
        bool baseValid = base.Validate();
        bool localValid = Books.Validate();
        return baseValid && localValid;
    }
}

BookCollection.cs

/// <summary>
/// The BookCollection class is designed to work with lists of instances of Book.
/// </summary>
public class BookCollection : EntityCollectionBase<Book>
{
    /// <summary>
    /// Initializes a new instance of the BookCollection class.
    /// </summary>
    public BookCollection()
    {
    }

    /// <summary>
    /// Initializes a new instance of the BookCollection class.
    /// </summary>
    public BookCollection (IList<Book> initialList)
        : base(initialList)
    {
    }
}

Andere Tipps

Ich glaube nicht, Sie haben Ihr n-Tier ganz richtig. Es klingt wie du bist mehr 2-Tier-Systeme zu bauen.

In einem echten 3-Tier-Projekt wird nur Ihre Datenebene erlaubt in die Datenbank zu sprechen. Sie haben das mit Ihrem „Modell“ oder „Common“ Projekten. Diese Projekte sind Ihre Datenebene. Aber wo Sie abdrehen ist, dass nur sollte das Business-Tier erlaubt werden, um sie zu sprechen. Ihre Präsentation Code sollte nicht erlaubt werden, überhaupt auf die Datenebene Projekte zu sprechen.

n-Tier kommt, wenn Sie mehr als 3 „Ebene“, aber das gleiche Prinzip Anbringgeräte: jede Stufe nur weiß, wie man verwenden (und braucht nur einen Verweis auf) die eine darunter, und stellt dann eine api für das Tier darüber. In meinen eigenen Projekten, nehme ich Ihre typische Präsentation, Business und Datenebene und biete ein viertes „Übersetzung“ tier zwischen Wirtschaft und Daten. Auf diese Weise kann die Datenebene zurückkehren generische Typen wie Datasets, Datatable, und datarow und die Business-Tier nur hat im Hinblick auf die stark typisierte Business-Objekten zu arbeiten. Die Übersetzung Tier nur wandelt zwischen den generischen Datenobjekte und stark typisierte Objekte. Auf diese Weise eine Änderung an einen der traditionellen Ebenen ist weniger wahrscheinlich, um eine Änderung in einem anderen erforderlich ist.

Die Datenschicht sollte Informationen in Bezug auf die Zeilen und Spalten speichern (vielleicht getippt Datenmengen verwenden, wenn Sie möchten), wenn Sie eine relationale Backend verwenden. Keine "Business-Objekte".

Die Business-Schicht sollte Ihre „Business-Objekte“ verwenden. Es kann zum Business Projekt einen Verweis hat.

Zusammenfassung:

  • UI hat Verweise auf Geschäfts- und Business
  • Handel hat Verweise auf Business und Daten

Hope, das hilft.

Ich habe ein Business Projekt Serverseite die Zuordnungen (ORM) und einen entsprechenden Service Data Access aussetzt CRUD Operationen an sie (und auch andere, wie GetAll) Speichern etc.

Ich würde vorschlagen, die Schaffung und Schnittstelle von dem, was Sie in dem Modellprojekt wollen, und diese Definition in der Datenschicht zu implementieren. Auf diese Weise alle drei (vier?) Projekte, die Definition verwenden können, ohne zu wissen, wie es umgesetzt werden.

Meiner Meinung nach, nur die Business-Schicht sollte die Kenntnis der Datenzugriffsobjekte haben. Es sollte sie für Datenoperationen verwenden, während seiner eigenen Geschäftsregeln und Logik anwenden, dann stumm Objekte zurück (zum Beispiel Datentransferobjekte) an die UI-Schicht oben.

Sie könnten einige etwas verwenden wie AutoMapper automatisch Karte zwischen Ihnen Daten und Business-Objekten.

Es hängt wirklich von dem Muster, wenn Sie MVC (Front Controller) verwenden, ist das Modell der domänenspezifische Darstellung der Daten, auf denen die Anwendung (in der Regel eine ORM Hilfe bei dieser) arbeitet wir ein DATA-Projekt verwenden für diese Klassen.

Die Modelle sind nicht Datenzugriffsobjekte, so dass der Datenzugriff in Form von Endlagern in einem anderen Projekt wird. Service für Geschäftsregeln und schließlich das Webprojekt. Bei diesem Ansatz wird die Data.dll in allen Projekten verwiesen. Das Modell ist wie allgegenwärtig.

DATA(Domain Model) -> REPOSITORY(Data Access) -> SERVICE(Business Rules) -> WEB
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top