2009-09-03 4 views
3

J'ai précédemment posé une question here à propos de autofac ne pas disposer de mes objets lorsque la requête HTTP se termine. Je pense maintenant que j'ai un plus gros problème, car il y a des preuves qu'il est en train de servir le même objet request-to-request. Encore une fois, j'utilise leurs instructions here. Mon test est un peu plus complexe car j'utilise la syntaxe du délégué pour créer un objet mais je pense que je le signale pour la durée de la requête. Global.asax.cs:autofac, l'intégration ASP.NET et HttpRequestScoped

protected void Application_Start(object sender, EventArgs e) 
{ 
    ... 
    var builder = new Autofac.Builder.ContainerBuilder(); 
    builder.Register<IDBConnectionSelector>(
      (c) => new CachingDBConnections(ConstructorArgs...)) 
     .HttpRequestScoped(); 

    var container = builder.Build(); 
    _containerProvider = new ContainerProvider(container); 
} 
public IContainerProvider ContainerProvider 
{ 
    get { return _containerProvider; } 
} 
static IContainerProvider _containerProvider; 

Mon intention est ici pour vous inscrire IDBConnectionSelector pour obtenir les CachingDBConnections de type béton créé avec un constructeur personnalisé mais avec la portée de la requête HTTP.

Certaines méthodes de l'objet CachingDBConnections échouent sur les demandes suivantes d'une manière qui me porte à croire que je reçois le même que celui que j'ai reçu la dernière fois et non un NOUVEAU pour chaque requête.

Est-ce que cela a du sens? Qu'est-ce que je fais mal?

+1

Je ne sais pas si cela fait une différence, mais j'enregistrerait votre service comme celui-ci. Builder.Register ( c => nouveaux CachingDBConnections (ConstructorArgs ...)) .Comme () HttpRequestScoped(); –

+0

Cette syntaxe a beaucoup plus de sens mais le résultat est le même. Plus de creuser je suppose - merci pour l'info! – n8wrl

Répondre

1

Je l'ai compris!

Je demandais le conteneur WRONG pour l'instance d'objet - je demandais le conteneur d'application pour l'objet et non le conteneur de demande.

D'oh!

2

La plupart du temps, cela se produit (dans n'importe quel conteneur IoC), vous trouverez qu'un composant le long d'une chaîne de dépendances est un singleton.

E.g.

A -> B -> C

Si A est 'usine', B est 'singleton' et C est 'usine', la résolution alors A sera obtenir une référence au singleton B, qui référence toujours le même C.

Pour qu'un nouveau C soit créé chaque fois que vous résolvez A, B doit également être 'usine'.

Comment est-ce que je pense? Est-ce le problème?

Nick

+0

Salut Nicholas! Merci beaucoup pour l'enregistrement. Je l'ai compris et posté ma réponse ... – n8wrl