Sto cercando di capire il modo più pulito per farlo.Miglior "modello" per il livello di accesso ai dati per l'oggetto aziendale
Attualmente ho un oggetto cliente:
public class Customer
{
public int Id {get;set;}
public string name {get;set;}
public List<Email> emailCollection {get;set}
public Customer(int id)
{
this.emailCollection = getEmails(id);
}
}
Allora il mio oggetto e-mail è anche piuttosto semplice.
public class Email
{
private int index;
public string emailAddress{get;set;}
public int emailType{get;set;}
public Email(...){...}
public static List<Email> getEmails(int id)
{
return DataAccessLayer.getCustomerEmailsByID(id);
}
}
Il DataAccessLayer attualmente si collega alla base di dati, e utilizza uno SqlDataReader per scorrere il set di risultati e crea nuovi oggetti e-mail e li aggiunge a un elenco che restituisce quando fatto.
Quindi dove e come posso migliorare?
Se il mio DataAccessLayer dovrò restituire un DataTable e lasciare l'oggetto Email da analizzare e restituire un Elenco al Cliente?
Immagino che "Fabbrica" sia probabilmente la parola sbagliata, ma dovrei avere un altro tipo di EmailFactory che prende un DataTable dal DataAccessLayer e restituisce un Elenco all'oggetto Email? Immagino che quel tipo di suoni sia ridondante ...
E 'forse una pratica corretta avere il mio email.getEmails (id) come metodo statico?
Potrei semplicemente buttarmi fuori cercando di trovare e applicare il miglior "schema" a quello che normalmente sarebbe un compito semplice.
Grazie.
Follow-up
ho creato un esempio di lavoro in cui il mio dominio/Business Object estrae un record di un cliente da id da un database esistente. I file di mappatura xml in nhibernate sono davvero accurati. Dopo aver seguito un tutorial per configurare le sessioni e le fabbriche del repository, il pull dei record del database era abbastanza semplice.
Tuttavia, ho notato un enorme successo in termini di prestazioni.
Il mio metodo originale consisteva in una stored procedure sul DB, chiamata da un oggetto DAL, che analizzava il set di risultati nel mio dominio/oggetto commerciale.
Ho eseguito il clock del mio metodo originale a 30 ms per acquisire una singola registrazione cliente. Ho quindi sincronizzato il metodo Nhibernate con 3000ms per catturare lo stesso record.
Mi manca qualcosa? O ci sono solo un sacco di spese generali con questa rotta di divieto?
Altrimenti mi piace la pulizia del codice:
protected void Page_Load(object sender, EventArgs e)
{
ICustomerRepository repository = new CustomerRepository();
Customer customer = repository.GetById(id);
}
public class CustomerRepository : ICustomerRepository
{
public Customer GetById(string Id)
{
using (ISession session = NHibernateHelper.OpenSession())
{
Customer customer = session
.CreateCriteria(typeof(Customer))
.Add(Restrictions.Eq("ID", Id))
.UniqueResult<Customer>();
return customer;
}
}
}
Il example I followed mi aveva creare una classe di supporto per aiutare a gestire la sessione, forse è per questo sto ottenendo questo overhead?
public class NHibernateHelper
{
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
Configuration cfg = new Configuration();
cfg.Configure();
cfg.AddAssembly(typeof(Customer).Assembly);
_sessionFactory = cfg.BuildSessionFactory();
}
return _sessionFactory;
}
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
Con l'applicazione su cui sto lavorando, la velocità è essenziale. E alla fine passeranno molti dati tra l'app web e il database. Se impiega un agente 1/3 di secondo per ottenere un record del cliente rispetto a 3 secondi, questo sarebbe un grande successo.Ma se sto facendo qualcosa di strano e questo è un costo di installazione iniziale di una volta, allora potrebbe valerne la pena se le prestazioni fossero altrettanto buone dell'esecuzione di stored procedure sul DB.
Ancora aperto ai suggerimenti!
Aggiornato.
Sto rottamando la mia rotta ORM/NHibernate. Ho trovato che le prestazioni sono troppo lente per giustificare l'utilizzo. Le richieste di base dei clienti richiedono troppo tempo per il nostro ambiente. 3 secondi rispetto alle risposte inferiori al secondo è troppo.
Se volessimo query lente, terremmo la nostra attuale implementazione. L'idea di riscriverlo era di aumentare drasticamente i tempi.
Tuttavia, dopo aver giocato con NHibernate la scorsa settimana, è un ottimo strumento! Semplicemente non si adatta alle mie esigenze per questo progetto.
Barry- Sì, funziona benissimo come è adesso. L'unica cosa che posso pensare è che il mio DataAccessLayer restituisca un DataTable, in modo da poter eseguire controlli di convalida nel mio Business Layer (ad es. Oggetto Email) invece che nel livello di accesso ai dati. –
L'esempio che hai pubblicato è il classico "modello di dominio anemico". Sulla base del tuo esempio non hai nemmeno bisogno di un oggetto business. Un oggetto aziendale dovrebbe mantenere la logica aziendale e il tuo no. –