2010-06-10 21 views
4

假設我有一個註冊爲HttpRequestScoped的依賴項,所以每個請求只有一個實例。我怎麼能解決一個HttpRequest之外的相同類型的依賴?在Autofac中的HttpRequest之外解決HttpRequestScoped實例

例如:

// 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. 
} 

上面的代碼拋出一個DependencyResolutionException當它執行CacheItemRemoved處理程序:

否範圍相匹配的表達式「值(Autofac.Builder.RegistrationBuilder`3 + < > c__DisplayClass0 [MyApp.Core.Data.MyDataContext,Autofac.Builder.SimpleActivatorData,Autofac.Builder.SingleRegistrationStyle])。lifetimeScopeTag.Equals(scope.Tag)'在請求實例的作用域中可見。

回答

3

InstancePerLifetimeScope(),而不是HttpRequestScoped(),會給你你需要的結果。

雖然有一個警告 - 如果IDatabase需要處理,或者取決於需要處理的事情,但如果您從ApplicationContainer解決它,則不會發生這種情況。最好做的事:

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

這可以工作,但由於某種原因,我做任何更改時都沒有保留回數據庫。 – 2010-06-16 17:44:33

+0

由於您不在HTTP請求之外,因此您添加的任何請求管道將不會執行;有可能你需要在某個地方提交一個事務。 – 2010-06-16 23:59:44