この質問は、私が直面した問題の診断を確認するために、または代替の説明を見つけるためにより多くのものです。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が初期化され、要求を処理する準備ができていることをいつ期待するかについて述べた参考資料は見つかりませんでした。そのような文書はありますか?
コンストラクター内でのStructureMap呼び出しの予測可能性に関する懸念事項を引用できますか?特定の回答のために、パレルモ(SMの著者の1人)がコンストラクタ内で 'BuildUp(this); 'を使用する参考文献を調べました – STW
http://codebetter.com/jeremymiller/2009/01/16/quot-buildup-quot -existing-objects-with-structuremap/ – STW
私は彼らが悪い考えであると言っている場所にはサイトを置くことができません。しかし、私が与える例は継承です。あなたがコンストラクタでBuildUp()を呼び出して、それが依存関係を正しく埋めると、それはうまく見えますが、継承ツリーで呼び出されるコンストラクタがさらに残っていれば、その値を上書きすることができます。 –