6

WebActivator.PreApplicationStartMethodで装飾されたクラスがいくつかあります。

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

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

私の質問は次のとおりです。

  1. 複数のWebActivator.PreApplicationStartMethodクラスを使用できますか?
  2. 最も重要なIoCが最初になるように、それらが初期化される順序を定義できますか?
  3. WebActivator.PreApplicationStartMethod静的クラスインスタンスは、コンストラクター定義の依存関係を解決するためにIoCコンテナーに依存できますか?
4

2 に答える 2

17

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

順序も定義できます。Order呼び出しで、名前付きパラメーターを渡すことができPreApplicationStartMethodます。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、コンストラクターインジェクションをどのように使用できるかわかりません。ただし、を使用してIoCリゾルバーをMvcのデフォルトのサービスロケーターとして登録することにより、サービスロケーター(アンチ?)パターンを使用できSystem.Web.Mvc.DependencyResolver.SetResolver(IDependencyResolver resolver)ます。

ただし、ここではサービスロケーターパターンの長所と短所については特に説明しません。

于 2012-09-25T20:10:51.280 に答える
1

PreAppStartメソッドAがPreAppStartメソッドBの後に実行する必要があることがわかっている場合、それを実現する唯一の方法は、Aの本体内にBへの呼び出しを明示的に追加することです。

その戦略が正しく機能するためには、PreAppStartメソッドの実装がべき等であること、つまり、安全に複数回呼び出すことができることも確認する必要があります。通常、これは、メソッドが静的ブール変数ですでに呼び出されているかどうかを追跡し、その値がtrueの場合は何もしないことで実現できます。

于 2012-01-28T00:03:50.843 に答える