2012-01-27 17 views
5

WebActivator.PreApplicationStartMethodで装飾されたクラスがいくつかあります。WebActivator.PreApplicationStartMethodクラスの初期化順序を定義します。

1つはNinject、もう1つはAwesomeMVC、もう1つはバックグラウンドタスクスケジューラです。

スケジューラクラスは、IoCコンテナによって解決される依存関係を利用する必要があるという問題があります。

私の質問は以下のとおりです。

  1. 私はいくつかのWebActivator.PreApplicationStartMethodクラスを持つことができますか?
  2. 最も重要なIoCが最初に来るように、それらを初期化する順序を定義できますか?
  3. WebActivator.PreApplicationStartMethod静的クラスインスタンスは、コンストラクタ定義の依存関係を解決するためにIoCコンテナに依存できますか?

答えて

1

あなたはPreAppStart方法AはPreAppStart方法Bの後に実行する必要があることがわかっている場合は、そのをachiveする唯一の方法は、明示的にその戦略についてA.

の体内でBへの呼び出しを追加することです正しく動作させるには、PreAppStartメソッドの実装が万能でないこと、つまり安全に複数回呼び出すことができることを確認する必要があります。通常、これはメソッドが静的ブール変数で既に呼び出されているかどうかを追跡し、その値が真であれば何もしないことによって達成できます。

+0

私は1つのPreAppStatメソッドを持っていても、何度も呼び出すことができますか?それはなぜそうですか? –

+1

フレームワークはメソッドを1回だけ呼び出します。しかし、A、B、Cの3つのコンポーネントがあるとします.AとBはどちらもCに依存しています(したがって、このガイドラインに従って、両方とも独自のメソッドでCのPreAppStartメソッドを呼び出します)。しかし、AとBは独立してお互いを知らないので、CのPreAppStartメソッドが何度呼び出されたかを調整することはできません。だから、Cのメソッドは冪等でなければならない。 – marcind

+0

ああ、私はそれを得る。ありがとうございました。 –

12

はい、WebActivator.PreApplicationStartMethodというアセンブリ属性を指しているクラスをいくつでも指定できます。多くのNuGetパッケージは、Global.asaxを編集せずにアプリケーションにブートストラップできるようにするため、この手法を使用しています。

注文を定義することもできます。 PreApplicationStartMethodコールでは、名前付きパラメータOrderを渡すことができます。 WebActivatorフレームワークは、メソッドが指定された順序で確実に呼び出されるようにします。例えば、このような何か、最初にあなたのIoCフレームワークレジスタを作るために:

[assembly: WebActivator.PreApplicationStartMethod(typeof(MyApp.App_Start.NinjectWebCommon), "Start", Order=1] 
[assembly: WebActivator.PreApplicationStartMethod(typeof(MyApp.App_Start.BGScheduler), "Start", Order=2] 

WebActivatorためのクラスが静的なクラスですが、私はあなたがそれらにコンストラクタ・インジェクションを使用することができますどのように表示されません。 ですが、System.Web.Mvc.DependencyResolver.SetResolver(IDependencyResolver resolver)を使用して、MobcのデフォルトのサービスロケータとしてIoCリゾルバを登録することにより、サービスロケータ(anti?)パターンを使用してください。

特にここではサービスロケータパターンの利点と欠点には行きたくありません。

+1

WebActivatorの代わりにWebActivatorExパッケージを使用する必要があることを言及するだけで十分です。 – Vitaly

関連する問題