Singleton Par le Contexte d'Appel (Demande Web) dans l'Unité

Il y A quelques jours j'ai eu ce problème avec ASP.Net le filetage. Je voulais avoir un objet singleton par requête web. J'ai réellement besoin de cela pour mon unité de travail. Je voulais instancier une unité de travail par requête web, de sorte que la carte d'identité est valable jusqu'à la demande. De cette façon, je pourrais utiliser un Cio à injecter mon propre IUnitOfWork à mes classes de dépôt de manière transparente, et j'ai pu utiliser la même instance à la requête, puis mise à jour de mes entités.

Depuis que je suis à l'aide de l'Unité, j'ai utilisé à tort PerThreadLifeTimeManager. J'ai vite réalisé que l'ASP.Net modèle de thread ne prend pas en charge ce que je veux atteindre. Fondamentalement, il utilise un theadpool et recycle les threads, et cela signifie que je reçois un UnitOfWork par thread!! Cependant, ce que je voulais, c'était une unité de travail par requête web.

Un peu de recherche sur google m'a donné ce post très. C'est exactement ce que je voulais, sauf pour l'unité de la partie qui était assez facile à réaliser.

C'est ma mise en œuvre pour PerCallContextLifeTimeManager de 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'utilise pour enregistrer mon unité de travail avec un code similaire à ceci:

unityContainer
            .RegisterType<IUnitOfWork, MyDataContext>(
            new PerCallContextLifeTimeManager(),
            new InjectionConstructor());

Espère qu'il sauve quelqu'un un peu de temps.

  • Solution sympa. Si vous me le permettez, je vous recommande de renommer ce "CallContextLifetimeManager" depuis requêtes Web sont probablement l'une des applications potentielles.
  • Vrai, j'ai mis à jour le texte et le code pour le refléter. Merci.
  • +1 Très utile.
  • Quel est le problème avec l'aide de PerResolveLifetimeManager?
  • Ce n'est pas une question!?
  • Pour info, ce n'est pas la "bonne" réponse/solution à ce problème. Dans ASP.NET une seule demande peut (et souvent sera en charge lourde) de saut entre les threads. Quand il le fait, le CallContext n'est pas reporté, et seul le HttpContext de la migration. Si vous voulez que cela fonctionne dans ASP.NET de façon fiable (sous charge) vous avez besoin de changer CallContext à HttpContext.Actuel.Les éléments de la place.