Domanda

Sono nuovo di NHibernate (e ORME) e cercando di venire alle prese con la miriade di opzioni diverse che presenta. Per avere un riferimento, sto usando Fluent NHibernate con oggetti di business separate che a loro volta utilizzano esclusivamente per l'accesso ai dati di DTO. La mia architettura delle applicazioni devono supportare entrambe le finestre e web "front-end".

Il mio quandry è uno dei approccio generale sembra che ci siano così tante opzioni. sguardo qualcosa di mio DTO come l'esempio riportato di seguito. Ogni DTO ha un riferimento a un ISession che è passata a loro dal BO. Essi sono responsabili della propria caricare e salvare:

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)...

Prima di tutto: È questo l'approccio corretto a prendere -? Se il DTO avere la possibilità di salvare e caricare in sé

In secondo luogo: Indipendentemente da dove il salvataggio / codice di carico si trova, si dovrebbe utilizzare la stessa ISession per tutta la vita o di un oggetto, o dovrebbe hanno un ref al ISessionFactory e aprire una nuova sessione è richiesto ogni interazione del database volta?

    // 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

Naturalmente c'è sempre l'opzione 3, nessuna delle precedenti:)

È stato utile?

Soluzione

In generale, DTOs non contengono comportamento (come Save, Load) e non contengono conoscenza del modo in cui vengono persistevano (ISession). Sembra che ciò che si sta veramente creando è un layer di dati. Il vostro livello di business idealmente non dovrebbe conoscere ISession neanche. Detto questo, è possibile scorciatoia questa stratificazione tutto quello che vuoi come si adatta alle vostre esigenze, ma sarà probabilmente difficile cambiare ad un altro ORM in seguito, se il tuo ORM sanguina attraverso tutti i livelli.

Per la gestione del ciclo di vita ISession, si deve decidere se avete intenzione di utilizzare il modello UnitOfWork, che sostanzialmente dice che ogni richiesta di un utente riceve un nuovo ISession. Ci sono altre opzioni per ISession vita come bene e davvero non si sono limitati a questo proposito. Spesso, ci possono essere le migliori pratiche in giro per le app vs Windows Applicazioni Web vs. qualsiasi altro tipo di applicazione, ma non è stato specificato che si stesse scrivendo.

Altri suggerimenti

Tenere il caricamento / salvataggio codice separato dai vostri DTOs. Gli oggetti DTO sono solo visite dei dati sottostanti.

Nel fare le vostre domande, restituire i DTOs utilizzando una trasformazione. Qualcosa di simile a questo:

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

DTO sono destinate ad essere "oggetto di trasferimento dati". Cioè, oggetti muti usati per trasferire valori o collezioni di valori intorno nel vostro sistema. Essi non dovrebbero essere responsabili per la persistenza se stessi, o addirittura cartina 1-1 di oggetti di dominio nel vostro strato di dominio.

L'ISession è molto costoso per aprire / chiudere. Il problema con mantenendola aperta per troppo tempo è che il pool di connessioni non può riutilizzare la connessione fino a quando il tempo è scaduto o non è quello. Questo potrebbe essere un problema in un'applicazione multiutente.

Nel tuo scenario probabilmente sarei andare per un approccio orientato al servizio per memorizzare recuperare i dati. che significa il DTO sarebbe stato utilizzato solo internamente entro i confini di servizio. Se avete bisogno di copiare gli oggetti che hanno lo stesso aspetto vi consiglio di dare un'occhiata al automapper che è stato creato per questo specifico scopo. Se avete solo o web unico progetto una finestra, allora non è un problema. E 'quando si mescolano. Non è possibile gestire le sessioni allo stesso modo in un'applicazione di Windows come in una web app.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top