這個問題更多的是爲了確認我對我們遇到的問題的診斷 - 或者找到其他解釋。在HttpModule構造函數中,StructureMap似乎沒有準備好 - 這是否正確?
我們有一個HTTPModule攔截向webforms應用程序發出的每個請求。我們的工作是翻譯我們的集成合作夥伴發送的特定查詢字符串參數。
更重要的是,它被連接到StructureMap這樣的:
public class SomeModule : IHttpModule
{
public SomeModule()
{
ObjectFactory.BuildUp(this);
}
public IDependency Dependency { get; set; }
}
在以前的版本就顯得模塊並沒有被它執行它的請求處理時間注入。這導致了一些(醜陋的)防守檢查被添加,如:
public class SomeModule : IHttpModule
{
public SomeModule()
{
ObjectFactory.BuildUp(this);
if (SomeDependency == null)
{
// HACK: Not sure why this corrects the issue!
Dependency = ObjectFactory.GetInstance<ISomeDependency>();
}
}
public IDependency Dependency { get; set; }
}
你會注意到HACK評論 - 它解決了這個問題,但沒有很好的理由。
那麼,這個模塊已被重新用於另一個站點 - 而以前的黑客已經不再工作了。看了一段時間之後,我做了改變,將StructureMap調用移到構造函數之外,並且看起來很有效。
public class SomeModule : IHttpModule
{
public IDependency Dependency { get; set; }
public void IHttpModule.Init(HttpApplication context)
{
Initialize();
// the rest of the code
}
private bool _initialized;
private void Initialize()
{
if (_initialized)
{
return;
}
ObjectFactory.BuildUp(this);
_initialized = true;
}
}
所以,我我身邊有此行爲的幾個問題:
- 我懷疑是StructureMap沒有被完全初始化/配置正被稱之爲HTTP模塊構造函數時 - 同意/不同意,任何洞察力?
- 我還沒有找到任何參考資料,說明何時期望StructureMap被初始化並準備好爲請求提供服務。有沒有這樣的文件?
你能否引用關於構造函數中StructureMap調用的可預測性的任何引用?在挖掘具體的答案時,我碰到了Palermo(SM作者之一)使用'BuildUp(this);'在構造函數中使用的引用 – STW 2010-12-14 20:31:44
http://codebetter.com/jeremymiller/2009/01/16/quot-buildup-quot -existing-objects-with-structuremap/ – STW 2010-12-14 20:32:02
我不能在任何他們認爲這是個不好主意的地方上網。但我會舉的例子是繼承。如果你在構造函數中調用BuildUp(),並且它正確地填充了依賴關係,那看起來很好,但是如果在繼承樹中還有更多的構造函數要被調用,那麼這個值可能會被覆蓋。 – 2010-12-14 20:37:28