Estoy tratando de encontrar la manera más limpia de hacerlo.Mejor "patrón" para la capa de acceso a datos al objeto comercial
Actualmente tengo un objeto de 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);
}
}
Entonces mi correo electrónico objeto también es bastante básico.
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);
}
}
El DataAccessLayer conecta actualmente a la base de datos, y utiliza un SqlDataReader para iterar sobre el conjunto de resultados y crea nuevos objetos de correo electrónico y los añade a una lista que se devuelve cuando haya terminado.
Entonces, ¿dónde y cómo puedo mejorar esto?
¿Debo tener mi DataAccessLayer en su lugar devolver una DataTable y dejarla en el objeto Email para analizar y devolver una lista al cliente?
Supongo que "Factory" es probablemente la palabra incorrecta, pero ¿debería tener otro tipo de EmailFactory que toma una DataTable de DataAccessLayer y devuelve una lista al objeto Email? Supongo que ese tipo de sonido suena redundante ...
¿Es esta la práctica correcta tener mi Email.getEmails (id) como un método estático?
Tal vez me estoy tirando tratando de encontrar y aplicar el mejor "patrón" a lo que normalmente sería una tarea simple.
Gracias.
Seguimiento
He creado un ejemplo de trabajo donde mi dominio objeto/Negocios extrae un registro de cliente de identificación de una base de datos existente. Los archivos de mapeo xml en nhibernate son realmente geniales. Después de seguir un tutorial para configurar las sesiones y las fábricas de repositorios, extraer los registros de la base de datos fue bastante sencillo.
Sin embargo, he notado un gran golpe de rendimiento.
Mi método original consistía en un Procedimiento almacenado en la base de datos, que fue llamado por un objeto DAL, que analizó el conjunto de resultados en mi dominio/objeto comercial.
Me sincronicé con mi método original en 30ms para obtener un solo registro de cliente. Luego sincronicé el método nhibernate en tomar 3000ms para obtener el mismo registro.
¿Echo de menos algo? ¿O hay muchos gastos indirectos usando esta ruta de nhibernate?
De lo contrario me gusta la limpieza del código:
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;
}
}
}
El example I followed me había crear una clase de ayuda para ayudar a administrar la sesión, tal vez por eso me estoy poniendo esta sobrecarga?
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 la aplicación en la que estoy trabajando, la velocidad es esencial. Y, en última instancia, pasarán muchos datos entre la aplicación web y la base de datos. Si a un agente le toma 1/3 de segundo obtener un registro de cliente en lugar de 3 segundos, eso sería un gran golpe.Pero si estoy haciendo algo raro y este es un costo de configuración inicial de una sola vez, entonces valdría la pena si el rendimiento fuera tan bueno como la ejecución de procedimientos almacenados en la base de datos.
¡Aún abierto a sugerencias!
Actualizado.
Estoy cancelando mi ruta ORM/NHibernate. Descubrí que el rendimiento es demasiado lento para justificar su uso. Las consultas básicas de los clientes simplemente toman demasiado tiempo para nuestro entorno. 3 segundos en comparación con respuestas por debajo del segundo es demasiado.
Si queríamos consultas lentas, mantendríamos nuestra implementación actual. La idea de reescribirlo fue aumentar drásticamente los tiempos.
Sin embargo, después de haber jugado con NHibernate la semana pasada, ¡es una gran herramienta! Simplemente no se ajusta a mis necesidades para este proyecto.
Barry- Sí, está funcionando muy bien como es ahora. Lo único que se me ocurre es que mi DataAccessLayer devuelva una DataTable, de modo que pueda hacer comprobaciones de validación en mi Business Layer (es decir, objeto de correo electrónico) en lugar de hacerlo en la capa de acceso a datos. –
El ejemplo que publicó es el clásico "modelo de dominio anémico". Según su ejemplo, ni siquiera necesita un objeto comercial. Un objeto comercial debe contener la lógica comercial, y el tuyo no. –