2012-11-16 16 views
1

我正在使用StructureMap在ASP.NET中爲每個請求創建DbEntities實例。StructureMap中的HttpContextScoped,ASP.NET在後臺線程中拋出空引用異常

ObjectFactory.Initialize(x => 
{ 
    x.For<DbEntities>().HttpContextScoped().Use(CreateNewDbEntities); 
} 

我有一個bacgkround任務,每5秒嘗試使用DbEntities。

timer = new Timer(RunTasks, null, 1000 * 10/*time to wait until the first run*/, 1000 * 5/*time to wait between calls*/); 

現在,在方法RunTasks我得到空引用excption當我嘗試調用GetDbEntities

private static void RunTasks(object sender) 
{ 
    var muninService = GetDbEntities(); // Null reference excpetion 
} 

public static DbEntities GetDbEntities() 
{ 
    return ObjectFactory.GetInstance<DbEntities>(); 
} 

我猜測這是在後臺線程我沒有訪問httpcontextscope becauase。現在我對結構圖很陌生,我不知道要開始並解決這個問題。有任何想法嗎 ?

,我用其他方法:

private static DbEntities CreateNewDbEntities() 
{ 
    return new DbEntities(); 
} 
+1

有一個名爲'HybridHttpOrThreadLocalScoped'的生命週期,如果沒有'HttpContext',它將回退到每個線程緩存。 – PHeiberg

+0

在asp.net應用程序中運行後臺線程通常不是一個好計劃。 –

+0

@Damien_The_Unbeliever我很清楚在asp.net應用程序中運行後臺線程的缺點。謝謝 – Dorin

回答

2

嘗試:

ObjectFactory.Initialize(x => 
{ 
    x.For<DbEntities>().HybridHttpOrThreadLocalScoped().Use(CreateNewDbEntities); 
} 

這應該緩存每個線程的情況下,如果HttpContext不可用。

+0

對於'HttpContextScoped'實例,我在'Global.asax'的'Application_EndRequest'方法中運行'ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects()'。在這種情況下有類似的東西嗎?還是應該由任務本身來照顧呢? – marapet

+0

我不知道如何去做,但我設法找到一個關於它的問題[這裏](http://stackoverflow.com/questions/6424629/how-to-release-hybridhttporthreadlocalscoped-objects-in-structuremap )。基本上,它歸結爲'新的HybridLifecycle()。FindCache()。DisposeAndClear();' – PHeiberg