Frage

Ich bin neu in NHibernate (und ORMS) und zu versuchen, in dem Griff mit der Vielzahl von verschiedenen Möglichkeiten es Geschenke zu kommen. Als Referenz verwende ich Fluent NHibernate mit eigenen Business-Objekten, die wiederum den Einsatz DTO sind rein für den Datenzugriff. Meine Anwendungsarchitektur müssen beide Fenster und Web „Frontends“ unterstützen.

Meine quandry ist ein allgemeiner Ansatz, wie es scheinen so viele Optionen. Mein DTO Blick etwas wie das folgende Beispiel. Jede DTO hat einen Verweis auf ein ISession, die sie von der BO übergeben wird. Sie sind verantwortlich für ihre eigene Last und speichern:

public class EmployeeDTO...

    // Data Properties to be persisted to the database
    public virtual int Id { get; private set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual ISession Session { get; set; }

    // Save logic
    public virtual void Save()
    {
        var transaction = Session.BeginTransaction();
        Session.SaveOrUpdate(this);
        transaction.Commit();
    }

    // Load logic
    public virtual void Load(int id)...

Zu allererst: Ist dies der richtige Ansatz zu nehmen - sollte die DTO haben die Fähigkeit, sich selbst zu speichern und laden

Zweitens: Unabhängig davon, wo die Save / Load-Code liegt, sollten Sie die gleiche ISession für die gesamte Lebensdauer verwenden oder ein Objekt, oder sollten sie einen ref zum ISessionFactory und öffnen Sie eine neue Sitzung jedes Mal Datenbank-Interaktion erforderlich ist?

    // Open a new session every time I interact with the repository
    var session = FluentSupport.SessionFactory.OpenSession();
    var transaction = Session.BeginTransaction();
    Session.SaveOrUpdate(this);
    transaction.Commit();
    session.Close();
    // Close the session when I'm done

Natürlich gibt es immer die Option 3, keine der oben genannten:)

War es hilfreich?

Lösung

Im Allgemeinen DTOs enthält keine Verhalten (wie Speicher, Laden) und enthält keine Kenntnisse darüber, wie sie beharrt erhalten (ISession). Es klingt wie das, was Sie wirklich schaffen eine Datenschicht ist. Ihre Business-Schicht sollte idealerweise nicht wissen, über ISession entweder. Dieser sagte, können Sie die Verknüpfung all Schichtung Sie wollen, wie es Ihren Bedürfnissen entspricht, aber es wird wahrscheinlich Wechsel in einen anderen ORM schwierig sein, später, wenn Ihr ORM blutet durch alle Schichten.

Für ISession Lebensdauer-Management, müssen Sie entscheiden, ob Sie die UnitOfWork Muster verwenden werden, die im Grunde sagt jeder Benutzeranfrage eine neue ISession bekommt. Es gibt andere Optionen für ISession Lebensdauer als auch und Sie wirklich in dieser Hinsicht nicht beschränkt ist. Oft gibt um Web-Anwendungen gegenüber Windows-Anwendungen gegen was auch immer andere Arten von Anwendungen Best Practices sein können, muss man aber nicht angeben, welche Sie schreiben würden.

Andere Tipps

Halten Sie Ihren Laden / Speichern-Code von Ihrem DTOs trennen. Die DTO-Objekte sind nur Ansichten der zugrunde liegenden Daten.

Wenn Ihre Fragen zu tun, gibt die DTOs durch eine Transformation. So etwas wie folgt aus:

resultSet = session.CreateCriteria(typeof(MyDataObject))
    .Add(query criteria, etc.)
    .SetResultTransformer(Transformers.AliasToBean<MyDTOObject>())
    .List<IMyDTOObject>()

DTO sollen „Datentransferobjekte“ sein. Das heißt, verwendet stumme Objekte für Werte oder Sammlungen von Werten um in Ihrem System übergeben. Sie sollten sich nicht verantwortlich für die anhaltende oder sogar 1-1 zu Domain-Objekte in Ihrer Domäne Schicht abzubilden.

Die ISession ist sehr preiswert zu öffnen / schließen. Das Problem mit dem Halt sie zu lange geöffnet ist, dass der Verbindungspool nicht die Verbindung bis zum Timeout wieder verwenden kann, oder was nicht. Dies könnte ein Problem in einer Multi-User-Anwendung sein.

In Ihrem Szenario würde ich wahrscheinlich für einen serviceorientierten Ansatz zu speichern gehen Daten abzurufen. die DTO Sinn würde nur intern innerhalb der Servicegrenzen hinweg genutzt werden. Wenn Sie kopieren Objekte benötigen, die gleich aussehen Ich schlage vor, Sie haben einen Blick auf AutoMapper , die erstellt wurde diese bestimmten Zweck. Wenn Sie ein Windows nur oder Web haben nur projizieren, dann ist es kein Problem. Es ist, wenn Sie mischen. Sie können die Sitzungen die gleiche Art und Weise in einer Windows-Anwendung wie in einem Web-App behandeln.

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