Mi sto imbattendo in uno scenario interessante su cui non sono stato in grado di ottenere risposte. Mi piacerebbe vedere se ci sono soluzioni eleganti per questo. Ecco alcuni casi d'uso:
-
Voglio passare l'identità / utente principale dell'utente che ha chiamato un'azione API in un controller su livelli di Servizi e Repository. Ci sono decisioni importanti che vengono prese a livello di servizio a seconda delle affermazioni e / o privilegi / permessi dell'utente.
-
Desidero identificare un tenant (si verifica usando intestazioni HTTP o nomi host) ma passare le informazioni sui titolari ai livelli Servizi e Repository in modo che possano essere utilizzate diverse cache e database Redis a seconda del titolare.
Posso facilmente creare un metodo in un servizio di base chiamato WithTenant (oggetto tenant); che posso usare per passare inquilini.
Questo significa che ogni chiamata di servizio che faccio avrà bisogno di questa chiamata a Conner.
Ad es. una chiamata:
_inventoryService.CheckInventory()
ora cambierà in:
_inventoryService.WithTenant(tenant).CheckInventory();
Allo stesso modo, se voglio passare HttpRequest oltre al Tenant, dovrò fare questo:
_inventoryService.WithHttpRequest (Request) .WithTenant (inquilino) .CheckInventory ();
Questo diventa ancora più complesso in quanto ho bisogno di passare questo al livello del repository. My Mongo DB Context è un singleton. Potrei doverlo cambiare per accettare l'inquilino in modo che la stringa di connessione possa essere modificata in base al tenant.
Quindi stavo pensando:
- Non c'è un modo in cui posso passare un oggetto Contesto attraverso questi livelli? Magari costruire una classe Context e impostare proprietà come Request o Tenant o qualsiasi altra cosa di cui ho bisogno e poi passarla attraverso i layer?
- Ancora più importante, c'è un modo per iniettarlo dinamicamente nei Costruttori di questi servizi, quindi non ho bisogno di ricollegarlo manualmente di nuovo? So che posso memorizzare il mio contesto nell'oggetto Request o forse anche in un contesto Owin. Potrei in qualche modo iniettarlo? Se è così, non ho visto nessun buon esempio su più livelli.
Suppongo che sto semplicemente cercando di semplificare la capacità di passare lo stato tra i livelli. Funzioni di taglio trasversale come Caching, Registrazione, Modifica dell'accesso al database su base Tenant, quindi se potessi creare un contesto centrale, ciò semplificherebbe enormemente le cose.
Qualche idea? Mi piacerebbe vedere cosa stanno facendo gli altri per risolvere questi problemi.