Stavo cercando una risposta a una domanda simile e sono d'accordo con le due risposte con il punteggio più alto. Cercando di chiarire questo punto per me stesso, ho scoperto che se le specifiche, che vanno di pari passo con il pattern Repository, vengono implementate come membri di prima classe del modello di dominio, allora posso
- riutilizzare le definizioni delle specifiche con parametri diversi,
- manipolare i parametri delle istanze di specifica esistenti (ad esempio per specializzarsi),
- combinali ,
- eseguire la logica di business su di essi senza dover mai accedere al database,
- e, naturalmente, testarli in unità indipendentemente dalle implementazioni effettive del repository.
Potrei anche spingermi così lontano e affermare che, a meno che il pattern Repository non venga utilizzato insieme al pattern Specification, non è realmente "Repository", ma un DAL. Un esempio artificioso in pseudo-codice:
specification100 = new AccountHasMoreOrdersThan(100)
specification200 = new AccountHasMoreOrdersThan(200)
assert that specification200.isSpecialCaseOf(specification100)
specificationAge = new AccountIsOlderThan('2000-01-01')
combinedSpec = new CompositeSpecification(
SpecificationOperator.And, specification200, specificationAge)
for each account in Repository<Account>.GetAllSatisfying(combinedSpec)
assert that account.Created < '2000-01-01'
assert that account.Orders.Count > 200
Vedi il Saggio delle specifiche di Fowler per i dettagli (questo è ciò su cui ho basato quanto sopra).
Un DAL avrebbe metodi specializzati come
IoCManager.InstanceFor<IAccountDAO>()
.GetAccountsWithAtLeastOrdersAndCreatedBefore(200, '2000-01-01')
Puoi vedere come questo può diventare rapidamente complicato, soprattutto perché devi definire ciascuna delle interfacce DAL / DAO con questo approccio e implementare il metodo di query DAL.
In .NET, le query LINQ possono essere un modo per implementare le specifiche, ma la combinazione delle specifiche (espressioni) potrebbe non essere agevole come con una soluzione sviluppata internamente. Alcune idee per questo sono descritte in questa domanda SO .