Il ya quelques jours, j'ai eu ce problème avec le threading ASP.Net. Je voulais avoir un objet singleton par requête web. J'ai vraiment besoin de ceci pour mon unité de travail. Je voulais instancier une unité de travail par requête web afin que la carte d'identité soit valide tout au long de la requête. De cette façon, je pourrais utiliser un IoC pour injecter mon propre IUnitOfWork à mes classes de dépôt de manière transparente, et je pourrais utiliser la même instance pour interroger puis mettre à jour mes entités.Singleton par appel contexte (demande Web) dans l'unité
Depuis que j'utilise Unity, j'ai utilisé par erreur PerThreadLifeTimeManager. J'ai vite réalisé que le modèle de threading ASP.Net ne supporte pas ce que je veux réaliser. Fondamentalement, il utilise un theadpool et recycle les threads, et cela signifie que je reçois un UnitOfWork par fil !! Cependant, ce que je voulais, c'était une unité de travail par requête Web.
Un peu de googling m'a donné this great post. C'était exactement ce que je voulais. sauf pour la partie unité qui était assez facile à réaliser.
Ceci est mon application pour PerCallContextLifeTimeManager pour 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()
{
}
}
Et bien sûr, je l'utiliser pour enregistrer mon unité de travail avec un code similaire à ceci:
unityContainer
.RegisterType<IUnitOfWork, MyDataContext>(
new PerCallContextLifeTimeManager(),
new InjectionConstructor());
L'espoir, il sauve quelqu'un un peu de temps.
Belle solution. Si vous me le permettez, je recommanderais de renommer ceci à "CallContextLifetimeManager" puisque les demandes Web sont probablement seulement l'une des applications potentielles. –
Certes, j'ai mis à jour le texte et le code pour refléter cela. Merci. –
+1 Très utile. – MrDustpan