1

私は、standart NinjectMVC3 BootstrapperをApp_Startフォルダにインストールして使用します。Ninjectとグローバルフィルタによる依存性注入:IAuthorizationFilter

マイアプリケーションクラスのようになります。私は唯一の入札ルールを以下している

public class MvcApplication : HttpApplication 
{ 
    static void RegisterRoutes(RouteCollection routes) 
    { 
     // ... routes here ... 
    } 

    public void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 
    } 

    static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     // empty 
    } 
} 

はNinjectMVC3に登録さ:

Bind<IAccountsRepository>().To<AccountsRepository>(); 
this.BindFilter<GlobalAuthFilter>(FilterScope.Global, 0); 

そして、私のグローバルフィルタ:すべてのコントローラが

public class GlobalAuthFilter : IAuthorizationFilter 
{ 
    readonly IAccountsRepository _accountsRepository; 

    public GlobalAuthFilter(IAccountsRepository accountsRepository) 
    { 
     _accountsRepository = accountsRepository; 
    } 

    public void OnAuthorization(AuthorizationContext context) 
    { 
     // Code here never reached. Why? What's wrong? 
    } 
} 

あります私のアプリケーションで。そして、すべてのコントローラが呼び出すすべてのアクションに対してOnAuthorizationを呼び出す必要があります。

しかし、私のコードdosn'tは動作します。ありがとう。

答えて

4

あなたのコードからは、具体的にカーネルを設定しているところはありません。これは~/App_Start/NinjectMVC3.csRegisterServices方法で行う必要があります:あなたはNinject.MVC3 NuGetパッケージをインストールすると

/// <summary> 
/// Load your modules or register your services here! 
/// </summary> 
/// <param name="kernel">The kernel.</param> 
private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<IAccountsRepository>().To<AccountsRepository>(); 
    kernel.BindFilter<GlobalAuthFilter>(FilterScope.Global, 0); 
}   

このメソッドの本体が空になり、それはあなたが直接、あなたが考え依存関係を設定したり、Ninjectモジュールを定義する必要があります場所です

/// <summary> 
/// Load your modules or register your services here! 
/// </summary> 
/// <param name="kernel">The kernel.</param> 
private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Load(new MyModule()); 
}   

カスタムモジュール定義されています:

public class MyModule : NinjectModule 
{ 
    public override void Load() 
    { 
     this.Bind<IAccountsRepository>().To<AccountsRepository>(); 
     this.BindFilter<GlobalAuthFilter>(FilterScope.Global, 0); 
    } 
} 
+0

はい、私ナンプラーをこの方法でインポートRegisterServicesでバインディングルールをcedします。しかし、それは動作しません。 –

+1

@JeanLouis、私はちょうどこのコードをテストし、それは完全に正常に機能しました。手順:1.新しいASP.NET MVC 3アプリケーションを作成します。 2. Ninject.MVC3 NuGetパッケージをインストールします。 3.「IAccountsRepository」、「AccountsRepository」、および「GlobalAuthFilter」タイプを定義します。 4.私の答えに示したコードをRegisterServicesメソッドに入れます。 5.アプリケーションを実行します。 6. OnAuthorizationが実行されます。 –

+0

Ninjectモジュールの例を説明するために私の答えを更新しました。 –