Sto costruendo un'applicazione che compila un singolo documento PDF da più documenti PDF di origine come segue: prende la prima pagina di ogni documento sorgente, stampa alcune informazioni in cima a ciascuna di quelle pagine e quindi combina tutte quelle " prime pagine "in un documento PDF di output. Supponiamo che i PDF di origine esistano già.
Utilizzo una libreria di classi di terze parti per manipolare i PDF, ad esempio estrarre le prime pagine, applicare le informazioni stampate e combinare le pagine per generare il PDF risultante. Il mio obiettivo è mantenere le operazioni di manipolazione dei PDF indipendenti dal mio livello logico di dominio in modo che sia più facile scambiare la libreria di terze parti se necessario in futuro. Per questo, mi piacerebbe utilizzare un livello anti-corruzione.
Immagino che il mio dominio consisterà in una classe (a questo punto): PdfDocument
. Il livello della logica di dominio carica una raccolta di% oggetti% di file da un altro tipo di flusso di input e fa uso di servizi esposti dal livello di anticorruzione per produrre un documento di output singolo con le caratteristiche che ho menzionato in precedenza. Posso immaginare due possibili modi di architettare questo:
-
espone i seguenti servizi distinti sul livello anti-corruzione: 1.) estrai la prima pagina di un documento PDF, cioè restituisci un
PdfDocument
che è una pagina, 2.) testo fornito da bollo in alto di unPdfDocument
fornito, ovvero restituisce un nuovoPdfDocument
che contiene il testo timbrato e 3.) combina più% oggetti% co_de in unPdfDocument
, ovvero restituisce un nuovoPdfDocument
che è tutte le pagine del file fornitoPdfDocument
s combinato. -
espone un singolo servizio sul layer anti-corruzione che accetta una raccolta di
PdfDocument
s e restituisce un singoloPdfDocument
con le caratteristiche sopra menzionate.
Il primo approccio sembra più in linea con la separazione delle preoccupazioni perché il secondo approccio dovrebbe assumere molte delle considerazioni logiche di dominio come "quante pagine estraggo?", "stampo ogni pagina?" e "quale delle pagine estratte da includere nell'output?". Tuttavia, il primo approccio è molto meno efficiente perché ogni servizio restituisce un PdfDocument
. La libreria di terze parti che sto utilizzando ha una classe PdfDocument
e una classe intermedia - PdfDocument
- che rappresenta una pagina che appartiene a un intero PDF Document
. Se utilizzo il primo approccio, la libreria di terze parti dovrebbe raggruppare tutto in un Page
e quindi generare un Document
per ciascun servizio. Tuttavia, se utilizzo il secondo approccio, posso operare in modo più efficiente su ciascun PDF perché i PDF di input possono essere suddivisi in Document
oggetti a cui i timbri potrebbero quindi essere applicati direttamente e quegli oggetti PdfDocument
potrebbero quindi essere combinati nel risultante Page
e solo successivamente restituiti come Page
.
Ho preso in considerazione l'aggiunta di una classe Document
al mio modello come una soluzione a questo, ma il mio modello sta assumendo preoccupazioni che non dovrebbe necessariamente avere. Non ho bisogno della nozione di "pagina" nel mio modello se non per facilitare un uso più efficiente della libreria di terze parti, e questo, per me, sconfigge lo scopo del livello anti-corruzione.
Per favore aiutami a superare questo!