Sto costruendo un'API Web che interfaccia SharePoint (un servizio Web esterno). Per ottenere la connessione al servizio esterno ho bisogno di creare istanze di ClientContext con qualche tipo di token.
Per questo ho creato un'interfaccia chiamata IClientContextFactory:
interface IClientContextFactory
{
Create ClientContext(string siteUrl)
}
Ho creato un'implementazione HttpClientContextFactory che crea oggetti usando le attestazioni dell'attuale HttpRequest che viene iniettata in fabbrica. Sulla base delle affermazioni, so a quale tenant si applica ClientContext.
Funziona bene con la web api, ma per quanto riguarda le mie applicazioni console di supporto che non hanno un contesto utente? Devo inviare l'id titolare con ogni messaggio a questi che a sua volta significa che l'interfaccia IClientContextFactory non funziona. Per questo ho creato IAppClientContextFactory:
interface IAppClientContextFactory
{
Create(Guid tenantId, string siteUrl);
}
Ciò risulta imbarazzante perché ora qualsiasi implementazione che dipende da IClientContextFactory è inutile nelle applicazioni della console poiché non posso implementarla senza un contesto utente.
Potrei aggiungere Create(Guid tenantId, string siteUrl)
a IClientContextFactory ma questo violerebbe Liskov dal momento che Create(string siteUrl)
genererebbe una NotImplementedException nelle applicazioni della console.
C'è un modo migliore per farlo? Sto prendendo l'approccio sbagliato a questo? Lo sto facendo anche correttamente e non dovrei preoccuparmi affatto? In particolare, è difficile per i nuovi sviluppatori dover capire quali dipendenze devono essere registrate nel contenitore IoC per la loro applicazione particolare.