2010-12-14 69 views
0

這個問題更多的是爲了確認我對我們遇到的問題的診斷 - 或者找到其他解釋。在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被初始化並準備好爲請求提供服務。有沒有這樣的文件?

回答

0

當你試圖在構造函數中構建一個類型時,我不會期望這種行爲是非常可預測的。通常認爲安全的許多操作在構造函數中都不被認爲是安全的(例如在類中使用虛擬屬性)。

你把代碼移到哪裏看起來好多了,我會離開它。如果你不能讓容器創建實例本身(因此被強制構建它),某種Initialize方法是執行構建操作的首選位置。

要回答您在文章末尾提出的問題: 決定何時初始化StructureMap由開發人員決定。在Web應用程序中,這幾乎總是在Application_Start()中的Global.asax中完成。在這種情況下,我希望容器在你的模塊被調用時準備好。

+0

你能否引用關於構造函數中StructureMap調用的可預測性的任何引用?在挖掘具體的答案時,我碰到了Palermo(SM作者之一)使用'BuildUp(this);'在構造函數中使用的引用 – STW 2010-12-14 20:31:44

+0

http://codebetter.com/jeremymiller/2009/01/16/quot-buildup-quot -existing-objects-with-structuremap/ – STW 2010-12-14 20:32:02

+0

我不能在任何他們認爲這是個不好主意的地方上網。但我會舉的例子是繼承。如果你在構造函數中調用BuildUp(),並且它正確地填充了依賴關係,那看起來很好,但是如果在繼承樹中還有更多的構造函數要被調用,那麼這個值可能會被覆蓋。 – 2010-12-14 20:37:28