2010-12-14 4 views
0

この質問は、私が直面した問題の診断を確認するために、または代替の説明を見つけるためにより多くのものです。HttpModuleコンストラクタ中にStructureMapが準備完了に見えない - これは正しいですか?

Googleには、Webformsアプリケーションに対するすべてのリクエストをインターセプトするHTTPModuleがあります。統合パートナーが送信する特定のクエリ文字列パラメータを翻訳するのが仕事です。モジュールがそれの要求処理を実行する時点で注入されていなかったと思われた以前のリリースの間

public class SomeModule : IHttpModule 
{ 
    public SomeModule() 
    { 
     ObjectFactory.BuildUp(this); 
    } 

    public IDependency Dependency { get; set; } 
} 

もっと重要なことは、このようなのStructureMapように配線しました。あなたはHACKコメントに気づくでしょう

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; } 
} 

- それは問題を解決しますが、正当な理由なしに:いくつかの(醜い)守備のチェックにつながったことは次のように追加されています。

まあ、この同じモジュールは、別のサイトで再利用されています。以前のハックはもう機能しませんでした。しばらくそれを見てから、コンストラクタの外でStructureMapコールを移動するように変更しました。それはうまく動作します。 - 、いかなる反対する/同意

  • 私の疑いがHttpModuleをコンストラクタが呼び出されたときの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が初期化され、要求を処理する準備ができていることをいつ期待するかについて述べた参考資料は見つかりませんでした。そのような文書はありますか?

答えて

0

コンストラクタに型を構築しようとしているときに、その動作が非常に予測できないとは思いません。通常は安全と見なされる多くのアクションは、クラス内で仮想プロパティを使用する場合など、コンストラクタでは安全ではないとみなされます。

ここでコードを移動した方がはるかに優れていて、そこに残しておきます。コンテナにインスタンスを作成させることができない場合(したがってビルドする必要がある場合)、何らかの初期化メソッドが構築アクションを実行するのに適した場所です。

投稿の末尾にある質問に答えるには: StructureMapが初期化される時期は、開発者が決定します。 Webアプリケーションでは、これはほとんどの場合、Application_Start()のGlobal.asaxで行われます。その場合は、モジュールが呼び出されたときにコンテナが準備されると思います。

+0

コンストラクター内でのStructureMap呼び出しの予測可能性に関する懸念事項を引用できますか?特定の回答のために、パレルモ(SMの著者の1人)がコンストラクタ内で 'BuildUp(this); 'を使用する参考文献を調べました – STW

+0

http://codebetter.com/jeremymiller/2009/01/16/quot-buildup-quot -existing-objects-with-structuremap/ – STW

+0

私は彼らが悪い考えであると言っている場所にはサイトを置くことができません。しかし、私が与える例は継承です。あなたがコンストラクタでBuildUp()を呼び出して、それが依存関係を正しく埋めると、それはうまく見えますが、継承ツリーで呼び出されるコンストラクタがさらに残っていれば、その値を上書きすることができます。 –

関連する問題