Sto cercando di sviluppare una libreria di classi in cui voglio implementare l'DbContext
personalizzato. Nel metodo SaveChanges
di DbContext
, ho bisogno di ottenere le informazioni dell'utente corrente (dipartimento, nome utente ecc.) Per scopi di controllo. Una parte del codice DbContext
è qui sotto:Come ottenere le informazioni dell'utente in DbContext utilizzando Net Core
public override int SaveChanges()
{
// find all changed entities which is ICreateAuditedEntity
var addedAuditedEntities = ChangeTracker.Entries<ICreateAuditedEntity>()
.Where(p => p.State == EntityState.Added)
.Select(p => p.Entity);
var now = DateTime.Now;
foreach (var added in addedAuditedEntities)
{
added.CreatedAt = now;
added.CreatedBy = ?;
added.CreatedByDepartment = ?
}
return base.SaveChanges();
}
Due opzioni che vengono a mente:
- Utilizzando
HttpContext.Items
di mantenere le informazioni dell'utente, l'iniezione IHttpContextAccessor e ottenere informazioni dalHttpContext.Items
(In questo casoDbContext
dipendeHttpContext
, è corretto?) - Utilizzo dell'oggetto ThreadStatic anziché
HttpContext.Items
e ottenere informazioni dall'oggetto ct (ho letto alcuni post che ThreadStatic non è sicuro)
Domanda: Qual è la soluzione migliore nel mio caso? C'è un altro modo che suggerisci?
invece di prendere una dipendenza su IHttpContextAccessor direttamente nel tuo DbContext perché non creare una classe di servizio come AuditLogger e lasciare che DbContext dipenda da esso, AuditLogger può dipendere da IHttpContextAccessor come proprio dettaglio di implementazione interna –
che sembra davvero un buon modo, lo farò prova ad implementarlo. Grazie. –