El uso de ActiveRecord es posible definir una clase como esta:Active Records vs. Repository: pros y contras?
class Contact
{
private String _name;
public String Name
{
get { return _name; }
set
{
if (value == String.IsNullOrWhiteSpace())
throw new ArgumentException(...);
else
_name = value;
}
}
public Boolean Validate() { ... /* check Name is unique in DB */ }
public Boolean Save() { ... }
public static List<Contact> Load() { ... }
}
Si bien esto es bueno y sencillo, he encontrado mis clases se vuelven muy hinchado con una gran mezcla de lógica pasando!
El uso de un diseño en capas/dominio se puede definir de la misma clase como:
class Contact
{
[Required(AllowEmptyStrings=false)]
public String Name { get; set; }
}
class ContactService : IService
{
public List<Contact> LoadContacts() { return (new ContactRepository()).GetAll(); }
public Contact LoadContact(int id) { return (new ContactRepository()).GetById(id); }
public Boolean SaveContact(Contact contact)
{
if (new ContactValidator().Validate(contact))
new ContactRepository().Save(contact);
}
}
class ContactRepository : IRepository
{
public List<Contact> GetAll() { ... }
public Contact GetById(int Id) { ... }
public Boolean Save(Contact contact) { ... }
}
class ContactValidator : IValidator
{
public Boolean Validate(Contact contact) { ... /* check Name is unique in DB */ }
}
class UnitOfWork : IUnitOfWork
{
IRepository _contacts = null;
public UnitOfWork(IRepository contacts) { _contacts = contacts; }
public Commit() { _contacts.Save(); }
}
¿Cómo fue que emigraron de registro => diseño en capas activa?
- validación a nivel de entidad en la incubadora Name => permanece (ableit a través de un DataAnnotation)
- La lógica de negocio/validación de reglas (nombre único) => pasado de entidad en una nueva ContactValidator separada
- Guardar lógica = > movido a una clase separada Repositorio patrón (también con un UnitOfWork) lógica
- carga => movido al repositorio separado
- Interacción con el Repositorio es a través de un nuevo ContactService (que cumplir el uso de ContactValidator, ContactRepository, UnitOfWork, etc - opuesto a lettin g la persona que llama suelta con el ContactRepository!).
Busco aprobación de los compañeros/sugerencias para este diseño en capas - No suelo fuera de diseño de tipo Active Record! Cualquier comentario apreciado.
NB - Este ejemplo es deliberadamente simple (el UnitOfWork no se usa realmente y el newing del Repository/Validator se manejaría de manera diferente).