Una logica di filtraggio dovrebbe essere in un repository o in un servizio?

7

Mi chiedo quanto segue: supponiamo di costruire un sistema in cui ci sia bisogno di alcune funzionalità di filtro per cercare qualche entità. Ad esempio, si potrebbe voler applicare il filtro a una tabella che elenca le entità per trovare qualcosa, o usarlo per generare un report su un set filtrato, qualunque sia.

Il punto è: dobbiamo avere una logica di filtraggio da qualche parte. Un cattivo modo per farlo sarebbe replicare la logica di filtraggio dove necessario. L'ho fatto una sola volta ed è una pessima idea.

D'altro canto, credo ci sia un metodo come Filter(FilteringOptions filteringOptions) progettato per eseguire l'operazione di filtro e restituire l'elenco filtrato di entità.

Ora, IMHO, la logica del filtraggio è una logica aziendale gentile. Gli esperti di business sono quelli che sanno come avviene il filtraggio, quali sono le cose filtrate e come. Per questo motivo, credo che la logica di filtraggio dovrebbe essere localizzata nel livello del dominio.

Ho trovato due opzioni per fare ciò: incorporare il metodo di filtraggio nel repository corrispondente per quella particolare entità, oppure creare un servizio di dominio come EntityNameSearchService che consumerebbe il repository per eseguire il filtraggio.

Sono ancora confuso quale sarebbe il modo migliore. Quindi, se sto cercando di usare DDD correttamente, dove dovrebbe essere questa logica di filtraggio? Sul repository o in un servizio separato?

    
posta user1620696 20.07.2016 - 17:46
fonte

1 risposta

4

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).

    
risposta data 21.07.2016 - 01:07
fonte

Leggi altre domande sui tag