NinjectとNugetをインストールしたMVC3エクステンションを使用しています。私のカーネル設定コードは、App_Start/NinjectMVC3.csファイルにあります。すべてがコントローラでうまく動作しますが、(適切に)Global.asax.cs MvcApplicationコードのインターフェイスをバインドする方法を理解することはできません。Application_Startでninjectカーネルにアクセスする
ハッキングを使用して終了しました(bootstrap.kernelを返す公開NinjectMVC3.GetKernel()メソッドを作成しました)。しかし、それは廃止される予定であり、私が見ていないこれを行う適切な方法が必要です。私が興味を持って二つのインタフェースがあります
public class LogFilterAttribute : ActionFilterAttribute
{
private IReportingService ReportingService { get; set; }
public LogFilterAttribute(IReportingService reportingService)
{
this.ReportingService = reportingService;
}
...
}
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new LogFilterAttribute() );
}
...
protected void Application_Start()
{
...
RegisterGlobalFilters(GlobalFilters.Filters);
// NOTE hack:
var kernel = NinjectMVC3.GetKernel();
var logger = kernel.Get<ILogger>();
var bw = new BackgroundWork(logger);
Application["BackgroundWork"] = bw;
bw.Start();
}
}
最初は単にグローバル変数(BackgroundWork用ILoggerです)にオブジェクトをバインドします
は、ここに私のコードです。
もう1つはActionFilterです。私はhttp://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/を読んでいますが、実際の登録(filter.Add)にどのようにつながっているのか分かりません。
私がそれを避けることができれば私はプロパティインジェクションを使いたくありません。
これを行う適切な方法についての考えはありますか? ありがとう
BindFilterに関して、私はfilters.addの代わりにそれを使用すると仮定していますか? RegisterGlobalFiltersでコードを削除できますか?しかし、現在、どのフィルタが使用されているかを確認する場所が2つあります。たぶん私は何かを見逃しています。フィルターの登録を保持し、デフォルトのコンストラクターを使用する必要がありますか? – teleball
DependencyResolverに関しては、AntiPattern(http://stackoverflow.com/questions/5653783/is-idpendencyresolver-an-anti-pattern)と、現在のハックが削除されている理由はありませんか? – teleball
@user: 'RegisterGlobalFilters'は、すべてのコントローラのすべてのアクションで実行されるフィルタ用です。 'BindFilter'構文は、特定の' Attribute'がコントローラやアクションで見つかったときに使用されるフィルタを登録します。この例では、 'MyFilterAttribute'が見つかるたびに' MyFilter'が実行されます。 – Aaronaught