8

Attualmente sto lavorando alla creazione di un'applicazione .NET Core utilizzando EF 6 e sto avendo qualche problema a comprendere l'uso appropriato dei vari metodi di registrazione delle dipendenze. Se ho capito bene:.NET Core/EF 6 - Ambito dell'iniezione delle dipendenze

  • Transient: oggetto viene creato quando necessario (ad esempio una nuova istanza ogni volta richiesto)
  • Singleton: istanza singola creato all'avvio dell'applicazione, e disponibile per tutte le seguenti richieste
  • limitato l'ambito: Disponibile per la durata di una richiesta

in particolare nella mia situazione, ho s et un paio di DbContexts (in base al modello CQRS) per gestire le query di database/comandi che sto registrando come mirino:

services.AddScoped((_) => new TestCommandContext(Configuration["Data:TestConnection:ConnectionString"])); 
services.AddScoped((_) => new TestQueryContext(Configuration["Data:TestConnection:ConnectionString"])); 

Questo è secondo la documentazione ASP.NET Getting Started with ASP.NET 5 and Entity Framework 6:

contesto dovrebbe essere risolto una volta per ogni campo di applicazione al fine di garantire le prestazioni e garantire un funzionamento affidabile di Entity Framework

Sto quindi registrando le rispettive classi UOW:

services.AddTransient<ITestCommandUnit, TestCommandUnit>(); 
services.AddTransient<ITestQueryUnit, TestQueryUnit>(); 

Sto usando Transient qui sulla base this articolo, il che suggerisce che:

registrati Servizi con portata transitoria vengono creati ogni volta che è necessario all'interno dell'applicazione. Ciò significa che una nuova istanza della classe (servizio registrato) verrà creata dal framework di iniezione delle dipendenze ogni volta che viene eseguito il metodo (in cui viene creata la dipendenza).

Sulla base di questa comprensione, sto usando la registrazione mio repository e di servizio classi sotto limitato l'ambito così:

services.AddScoped<ITestCommandRepository, TestCommandRepository>(); 
services.AddScoped<ITestQueryRepository, TestQueryRepository>(); 

services.AddScoped<ITestCommandService, TestCommandService>(); 
services.AddScoped<ITestQueryService, TestQueryService>(); 

Poi chiamare i miei rispettivi metodi di livello di servizio nei miei controllori in base alle esigenze:

In fase di test, questa configurazione sembra funzionare e l'impostazione di DbContext (s) come Scoperto ha senso - sembra inutile/inefficiente creare un nuovo oggetto di contesto ogni volta che viene richiesto.

Tuttavia, la scelta tra Transient/Singleton/mirino per gli altri oggetti è dove mi sono perso. Qualcuno può aiutarmi a capire la migliore configurazione per questa specifica implementazione dei pattern?

La configurazione di cui sopra funziona, ma sto cercando una maggiore comprensione di perché dovrei usare gli ambiti che ho fatto. (Vale a dire è Transient l'opzione migliore per la mia classe UOW Perché è una scelta migliore di Singleton in questa situazione Ecc??)

+0

"la scelta ... per gli altri oggetti è dove mi sono perso." Sembra che tu abbia già scelto e funzioni. Con quali altri oggetti hai avuto bisogno di aiuto in particolare? –

+0

Mentre le mie scelte di ambito sono effettivamente "funzionanti", spero che qualcuno possa approfondire i vantaggi/gli svantaggi di ciascuna delle opzioni dell'ambito nel contesto della suddetta configurazione. Ho funzionato, ma sto cercando una maggiore comprensione. –

+0

Beh, sicuramente non singleton. Potresti incontrare diversi problemi nella registrazione di singleton che dipendono dai tipi registrati come ambiti. Puoi dare un'occhiata a questo: https://blog.markvincze.com/two-gotchas-with-scoped-and-singleton-dependencies-in-asp-net-core/. Secondo la tua domanda, sembra che la tua scelta sia a posto. Tuttavia, si noti che i documenti ufficiali dicono di Transient: I servizi a vita temporanea vengono creati ogni volta che vengono richiesti. Questa durata funziona meglio per servizi leggeri e senza stato. – jpgrassi

risposta

-1
  • oggetti transitori sono sempre diversi; una nuova istanza viene fornita a ogni controller e ogni servizio.
  • oggetti con ambito sono uguali nella richiesta, ma differente attraverso diverse richieste
  • oggetti Singleton sono gli stessi per ogni oggetto e ogni richiesta (indipendentemente dal fatto che un'istanza è fornito in ConfigureServices)

Nel tuo caso, il servizio che stai iniettando non dipende dallo stato di altri oggetti all'interno della stessa richiesta. Si utilizza il servizio per ottenere un oggetto all'interno del Db. Funzionerà un servizio transitorio o con scope.

Se nella stessa richiesta è necessario modificare lo stato del proprio oggetto in base ai calcoli all'interno della stessa richiesta, sarà necessario utilizzare gli oggetti che vivono all'interno della stessa richiesta dall'inizio fino alla fine (es .: ambito).

+0

Questo è menzionato nella domanda e non risponde alla domanda reale. – Onots