Contesto del database e iniezione Singleton con IoC

2

Tutto quanto riportato di seguito riguarda un'app di ASP.NET c #. Ho un Singleton Settings MemoryCache che legge i valori dal database al primo accesso e li memorizza nella cache, quindi li invalida utilizzando il messaggio SQL Service Broker e rilegge come richiesto.

Ai fini dei controllori standard, creo il mio contesto Db in un ambito di richiesta. Tuttavia, questo ovviamente significa che non posso usare lo stesso contesto nella classe Settings Cache, dato che si tratta di un singleton e abbiamo una collisione tra scope.

Al momento, ho finito con due contesti db: i Controllori lo ricevono tramite il contenitore IoC, mentre un Singleton lo crea proprio.

Tuttavia, non sono soddisfatto di questo approccio (principalmente a causa del modo in cui mi sento su due contesti, la cache non imposta nulla sul db, quindi la concorrenza non è un problema tanto).

Che cos'è un modo migliore per farlo?

    
posta zaitsman 29.12.2013 - 23:27
fonte

2 risposte

3

Potresti dividere l'implementazione della cache in 2 parti, una cache e un CacheStorage.

CacheStorage è responsabile solo per l'archiviazione dei dati memorizzati nella cache e ha un Singleton tutta la vita. Perché è possibile accedere da più thread contemporaneamente, dovrebbe essere thread-safe.

La cache è la parte dinamica del meccanismo di memorizzazione nella cache, ha un PerRequest ciclo di vita e dipende sia da CacheStorage sia da DbContext. È responsabile della lettura delle impostazioni da DbContext al primo accesso e aggiornando i dati di CacheStorage con esso.

In questo modo, CacheStorage può essere mantenuto attivo per tutta la durata dell'applicazione e la cache viene istanziata solo quando è disponibile un DbContext valido.

    
risposta data 27.08.2014 - 09:34
fonte
0

DbContext non è thread-safe, quindi non dovresti usare un singleton DbContext in un'applicazione web ASP.NET. Viene creato un thread per richiesta e inizierai a ricevere le eccezioni non appena gli utenti inizieranno a utilizzare l'applicazione.

Sembra che tu stia avvolgendo la cache in un'altra classe che ha il suo DbContext. Perché non solo avere quella classe prendere un DbContext nel suo costruttore? Inoltre, c'è un motivo per cui non stai usando HttpContext.Current.Cache (classe Cache)? Questo è il modo preferito di cache in ASP.NET (se non si utilizza una cache di terze parti) e avrà la durata del dominio dell'app. Sono abbastanza sicuro che questo risolva tutti i tuoi problemi Singleton e 2 DbContext.

Secondo Microsoft

The MemoryCache class is similar to the ASP.NET Cache class. The MemoryCache class has many properties and methods for accessing the cache that will be familiar to you if you have used the ASP.NET Cache class. The main differences between the Cache and MemoryCache classes are that the MemoryCache class has been changed to make it usable by .NET Framework applications that are not ASP.NET applications. For example, the MemoryCache class has no dependencies on the System.Web assembly. Another difference is that you can create multiple instances of the MemoryCache class for use in the same application and in the same AppDomain instance.

fonte

    
risposta data 30.12.2013 - 00:54
fonte

Leggi altre domande sui tag