2010-06-10 11 views
4

Supposons que j'ai une dépendance qui est enregistrée en tant que HttpRequestScoped afin qu'il y ait une seule instance par requête. Comment pourrais-je résoudre une dépendance du même type en dehors d'une requête HttpRequest?Résolution d'instances HttpRequestScoped en dehors d'une requête HttpRequest dans Autofac

Par exemple:

// Global.asax.cs Registration 
builder.Register(c => new MyDataContext(connString)).As<IDatabase>().HttpRequestScoped(); 
_containerProvider = new ContainerProvider(builder.Build()); 

// This event handler gets fired outside of a request 
// when a cached item is removed from the cache. 
public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r) 
{ 
    // I'm trying to resolve like so, but this doesn't work... 
    var dataContext = _containerProvider.ApplicationContainer.Resolve<IDatabase>(); 
    // Do stuff with data context. 
} 

Le code ci-dessus jette un DependencyResolutionException quand il exécute le gestionnaire CacheItemRemoved:

aucune marge correspondant à l'expression valeur »(Autofac.Builder.RegistrationBuilder`3 + < > c__DisplayClass0 [MyApp.Core.Data.MyDataContext, Autofac.Builder.SimpleActivatorData, Autofac.Builder.SingleRegistrationStyle]). lifetimeScopeTag.Equals (scope.Tag) 'est visible depuis la portée dans laquelle l'instance a été demandée.

Répondre

3

InstancePerLifetimeScope(), plutôt que HttpRequestScoped(), donnera le résultat dont vous avez besoin. Il y a toutefois une mise en garde - si IDatabase nécessite une mise au rebut ou dépend de quelque chose qui nécessite une élimination, cela ne se produira pas si vous le résolvez à partir du conteneur d'application. Mieux à faire:

using (var cacheRemovalScope = 
     _containerProvider.ApplicationContainer.BeginLifetimeScope()) 
{ 
    var dataContext = cacheRemovalScope.Resolve<IDatabase>(); 
    // Do what y' gotta do... 
} 
+0

Cela fonctionne, mais pour une raison quelconque, aucun de mes changements sont persistés dans la base de données lorsque je fais cette modification. –

+0

Comme vous ne faites pas partie d'une requête HTTP, les ajouts de pipeline de requête que vous avez effectués ne seront pas exécutés; il y a des chances qu'il y ait une transaction que vous devez engager quelque part. –