Question

J'enquête sur l'utilisation d'Autofac dans notre application Web après avoir utilisé Castle Windsor dans le passé.

Ce que j’aime vraiment avec Autofac, c’est de pouvoir exprimer la construction de composants dynamiques à travers des expressions lamda, par opposition à la création de DependancyResolvers, etc. à Windsor.

Un de mes scénarios est que je souhaite qu'un composant particulier soit enregistré au niveau de la portée du niveau de session ASP.NET. Avec Windsor, je créerais / créerais un nouveau LifestyleManager, mais avec Autofac, j’ai trouvé ceci:

//Register SessionContext at HTTP Session Level
builder.Register(c =>
{
    HttpContext current = HttpContext.Current;

    //HttpContext handes delivering the correct session
    Pelagon.Violet.Core.Interfaces.SessionContext instance = current.Session["SessionContext"] as Pelagon.Violet.Core.Interfaces.SessionContext;

    if (instance == null)
    {
        instance = c.Resolve<Pelagon.Violet.Core.Interfaces.SessionContext>();
        current.Session["SessionContext"] = instance;
    }

    return instance;
})
.FactoryScoped();

Ce que je pourrais éventuellement transformer en une méthode d’extension. J'accepte que cette implémentation explose si le HttpContext.Current.Session est nul, car il ne doit être utilisé que dans une application Web.

La question est:

Quelle est la meilleure pratique pour un tel enregistrement dans Autofac. J'ai beaucoup entendu parler de l'utilisation de conteneurs imbriqués, etc., mais pas d'exemples concrets, et je tiens à comprendre ce qui pourrait ne pas être correct avec l'approche ci-dessus (la seule chose à laquelle je peux penser est le système d'élimination automatique).

Merci.

Était-ce utile?

La solution

Cela a l'air bien.

Marquer le composant 'ExternallyOwned ()' garantira qu'Autofac n'appelle pas Dispose () .

Les seuls pièges sont que votre composant de session peut résoudre ses propres dépendances via le conteneur actuel, et donc contenir des références à des éléments pouvant appartenir à la demande actuelle (par exemple). Cela devrait être facile à repérer. tester si.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top