2011-08-13 5 views
16

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)にどのようにつながっているのか分かりません。

私がそれを避けることができれば私はプロパティインジェクションを使いたくありません。

これを行う適切な方法についての考えはありますか? ありがとう

答えて

23

MVC 3は、シングルトンに入力されたDependencyResolverを導入し、Ninject拡張でサポートしています。あなたがそれを必要とする場合は、あなたのMvcApplicationクラスでそれを使用することができます。

protected void Application_Start() 
{ 
    // ... 
    var logger = DependencyResolver.Current.GetService<ILogger>(); 
} 

今、私はアクションフィルタでこれを行うには不要であることを指摘すべきです。あなたはBindFilterは、拡張メソッドで、あなたもNinject.Web.Mvc.FilterBindingSyntax名前空間を参照する必要があるためthisを使用する必要が

// Declare empty attribute 
public class MyFilterAttribute : FilterAttribute { } 

// Dependency module 
public class MyModule : NinjectModule 
{ 
    public override void Load() 
    { 
     // Other bindings 
     // ... 
     this.BindFilter<MyActionFilter>(FilterScope.Action, 1) 
      .WhenControllerHas<MyFilterAttribute>(); 
    } 
} 

注:Ninject.MVC3であなたはそうのように、BindFilter構文を使用することになっています。

+1

BindFilterに関して、私はfilters.addの代わりにそれを使用すると仮定していますか? RegisterGlobalFiltersでコードを削除できますか?しかし、現在、どのフィルタが使用されているかを確認する場所が2つあります。たぶん私は何かを見逃しています。フィルターの登録を保持し、デフォルトのコンストラクターを使用する必要がありますか? – teleball

+1

DependencyResolverに関しては、AntiPattern(http://stackoverflow.com/questions/5653783/is-idpendencyresolver-an-anti-pattern)と、現在のハックが削除されている理由はありませんか? – teleball

+0

@user: 'RegisterGlobalFilters'は、すべてのコントローラのすべてのアクションで実行されるフィルタ用です。 'BindFilter'構文は、特定の' Attribute'がコントローラやアクションで見つかったときに使用されるフィルタを登録します。この例では、 'MyFilterAttribute'が見つかるたびに' MyFilter'が実行されます。 – Aaronaught

関連する問題