Alcuni giorni fa ho riscontrato questo problema con il threading ASP.Net. Volevo avere un oggetto singleton per richiesta web. In realtà ho bisogno di questo per la mia unità di lavoro. Volevo istanziare un'unità di lavoro per ogni richiesta web in modo che la mappa delle identità fosse valida attraverso la richiesta. In questo modo ho potuto utilizzare un IoC per iniettare il mio IUnitOfWork nelle mie classi di repository in modo trasparente e utilizzare la stessa istanza per interrogare e aggiornare le mie entità.Contesto Singleton Per Call (richiesta Web) in Unity
Dal momento che sto usando Unity, ho erroneamente utilizzato PerThreadLifeTimeManager. Mi sono presto reso conto che il modello di threading ASP.Net non supporta ciò che voglio ottenere. Fondamentalmente usa un theadpool e ricicla i thread, e ciò significa che ottengo un UnitOfWork per thread !! Tuttavia, quello che volevo era una unità di lavoro per richiesta web.
Un po 'di googling mi ha dato this great post. Era esattamente quello che volevo; tranne per la parte di unità che era abbastanza facile da acheive.
Questa è la mia implementazione per PerCallContextLifeTimeManager per l'unità:
public class PerCallContextLifeTimeManager : LifetimeManager
{
private const string Key = "SingletonPerCallContext";
public override object GetValue()
{
return CallContext.GetData(Key);
}
public override void SetValue(object newValue)
{
CallContext.SetData(Key, newValue);
}
public override void RemoveValue()
{
}
}
E naturalmente Io lo uso per registrare il mio unità di lavoro con un codice simile a questo:
unityContainer
.RegisterType<IUnitOfWork, MyDataContext>(
new PerCallContextLifeTimeManager(),
new InjectionConstructor());
Speranza che salva qualcuno un po 'di tempo.
Soluzione piacevole. Se posso, ti consiglio di rinominarlo in "CallContextLifetimeManager" poiché le richieste Web sono probabilmente solo una delle potenziali applicazioni. –
Vero, ho aggiornato il testo e il codice per riflettere questo. Grazie. –
+1 Molto utile. – MrDustpan