Abbiamo due app: client desktop e amp; back-end in mvc. Entrambe le app hanno funzionalità di stampa. Ed è abbastanza ovvio che ci stiamo ripetendo. Lasciami spiegare questo. La routine appare come segue:
- L'utente inserisce il suo ID / invia i suoi dati all'endpoint mvc;
- Controlliamo il db se tutti i dati necessari sono validi;
- Componiamo un oggetto viewmodel (mvc) / dto (desktop);
- Come requisito ci sono due tipi di documenti da stampare;
- Quindi facciamo identiche chiamate a un'API di rendering PDF (usiamo PdfSharp) che compone due documenti.
Penso che sarebbe meglio se avessimo le logiche di composizione in PDF in un assembly separato. Quindi potrebbe essere riutilizzabile. Il problema è che i documenti utilizzano proprietà leggermente diverse (dati). Come soluzione possiamo usare un dto condiviso con tutte le proprietà necessarie:
public IEnumerable<string> Render(DocumentDto document) {
// ioc
foreach(var strategy in this.strategies) {
if(strategy.CanRender(document)) {
yield strategy.Render(document);
}
}
}
Possiamo anche iniettare l'oggetto DbContext nelle nostre startegies. E ogni strategia richiederebbe le proprietà desiderate da sola:
public class StrategyA {
// I'll omit ctor here
private DbContext db;
public string Render() {
// make db calls
// render the document
}
}
Ma non penso che questa sia una buona soluzione in quanto richiede una dipendenza da db.
Possiamo progettarlo in modo che ogni strategia utilizzi solo il proprio insieme di proprietà?