Korzystanie ActiveRecord można zdefiniować klasę tak:Aktywne rekordy a repozytorium - plusy i minusy?
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() { ... }
}
Chociaż to ładne i proste, znalazłem moje zajęcia się bardzo nadęty z dużym mieszanką logika dzieje!
Stosując konstrukcję warstwową/domeny można określić tę samą klasę, takich jak:
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(); }
}
Jak zostało to przeniesione z Active Record => warstwowa konstrukcja?
- Podmiot walidacji poziom w imię seter => pozostaje (ableit poprzez DataAnnotation)
- logika Biznes/walidacji zasada (unikalna nazwa) => przeniesiony z jednostki do nowego oddzielnego ContactValidator
- Zapisz logiczny = > przeniesiono do oddzielnego Repository grupy typu (również z UnitOfWork) logiki
- obciążenie => przeniesiono do oddzielnego repozytorium
- interakcji z repozytorium poprzez nowy ContactService (który będzie wymuszał stosowanie ContactValidator, ContactRepository, UnitOfWork, etc - przeciwieństwie do lettin g dzwoniącego luźnego z ContactRepository!).
Poszukuję aprobaty/sugestii dla tego projektu warstwowego - zwykle nie projektuję poza typem Aktywnej Rejestracji! Każdy komentarz doceniony.
NB - Ten przykład jest celowo prosty (UnitOfWork tak naprawdę nie jest używany, a tworzenie repozytorium/walidatora będzie obsługiwane inaczej).