1

Я использую стандартную загрузочную загрузку NinjectMVC3, установленную в папке 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 
    } 
} 

Я только следующие правила торгов Registed в 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 для каждого вызова действий для каждого контроллера.

Но мой код не работает. Благодарю.

ответ

4

Это не совсем понятно из вашего кода, где более конкретно вы настраиваете свое ядро. Это должно быть сделано в RegisterServices методе ~/App_Start/NinjectMVC3.cs:

/// <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); 
}   

При установке NuGet пакета Ninject.MVC3 тело этого метода будет пустым, и где вы должны либо непосредственно настраивать зависимости или определить модули 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

Да, я пла ced правил привязки в RegisterServices. Но это не сработает. –

+1

@JeanLouis, я только что протестировал этот код, и он работал отлично. Шаги: 1. Создайте новое приложение ASP.NET MVC 3. 2. Установите пакет Ninject.MVC3 NuGet. 3. Определите типы 'IAccountsRepository',' AccountsRepository' и 'GlobalAuthFilter'. 4. Поместите код, который я указал в своем ответе в методе RegisterServices. 5. Запустите приложение. 6. Выполняется OnAuthorization. –

+0

Я обновил свой ответ, чтобы проиллюстрировать пример с модулями Ninject. –

Смежные вопросы