I'm wondering the following: suppose we are building a system where there needs to be some filtering functionality to search for some entity. For example, one might want to apply the filtering to a table listing the entities to find something, or use it to generate a report on a filtered set, whatever.
Dovresti osservare che questo punto che i tuoi casi d'uso per il filtro si centrano attorno a legge , piuttosto che alle scritture. Questo è il modello normale: una scrittura viene generalmente indirizzata a una specifica radice aggregata nel dominio.
Se stai eseguendo una lettura, in realtà non ti preoccupi degli aggregati - non ti interessa l'applicazione dell'invarianza di business perché in realtà non stai cercando di cambiare nulla. Ti interessa solo lo stato.
Il che potrebbe significare che ha senso ignorare completamente il modello di dominio.
Solo qualcosa a cui pensare.
Now, IMHO, the filtering logic is a kind business logic. The business experts are the ones who knows how the filtering takes place, what things are filtered and how. Because of that, I believe the filtering logic should be located in the domain layer.
Sì e no. Stai attingendo al linguaggio onnipresente per descrivere il filtro. Quindi stai definitivamente usando il vocabolario di dominio.
Ma non hai alcun "comportamento", in quanto non stai effettivamente modificando il libro dei record, quindi non hai l'invariante di cui preoccuparti.
On the other hand, I belive there should be a method like Filter(FilteringOptions filteringOptions) designed to perform the filtering operation and return the filtered list of entities.
Sei molto vicino all'idea di "Specifica" . Fondamentalmente è un predicato che un repository può utilizzare per identificare quali artefatti corrispondono a criteri arbitrari.
Ci sono alcune trappole di cui essere a conoscenza. Greg Young li ha toccati qualche tempo fa, ma io riassumi qui.
Innanzitutto, l'astrazione dell'esecuzione di un predicato contro una raccolta è O (N). Probabilmente vorrai qualcosa di più bello, specialmente se il tuo negozio di persistenza è intelligente nell'indicizzazione. Il tuo componente di persistenza probabilmente vorrà essere in grado di trasformarlo in un vincolo di implementazione specifico (esempio: prendere una specifica e trasformarla in una clausola where su un'istruzione preparata).
In secondo luogo, un'interfaccia è un mezzo per documentare il contratto servito dal componente di persistenza. "Rendi l'implicita esplicita" - se descrivi di cosa hai veramente bisogno, l'interfaccia ti dice qualcosa su quali caratteristiche sono importanti per il tuo data store, il che ti dà un posto unico da guardare quando cerchi di valutare se un'alternativa il negozio è adatto.
(Naturalmente, l'implementazione di quell'interfaccia potrebbe essere solo un adattatore che crea la specifica dagli argomenti del metodo e inoltra il problema insieme. Va bene, hai acquisito il requisito reale).