2015-09-28 79 views
2

我想注入到Hangfire AuthorizationFilter我的自定義服務器,並用它做一些事我的問題是我的服務始終爲空。MVC Hangfire授權Ninject

Owin啓動類:

public class Startup 
{ 

    public void Configuration(IAppBuilder app) 
    { 
     GlobalConfiguration.Configuration 
      .UseSqlServerStorage("SomeContext") 
      .UseNinjectActivator(new Bootstrapper().Kernel); 

     app.UseHangfireDashboard("/hangfire", new DashboardOptions { AuthorizationFilters = new[] { new RestrictiveAuthorizationFilter() } }); 
     app.UseHangfireServer(); 
    } 
} 

自定義過濾器:

public class RestrictiveAuthorizationFilter : IAuthorizationFilter 
{ 

    [Inject] 
    public IUserService _userService { get; set; } 

    public bool Authorize(IDictionary<string, object> owinEnvironment) 
    { 

     //do something with _userService but it is always null 

     return true; 
    } 
} 

Ninject內核:

private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind(x => { x.From(typeof(BookService).Assembly).SelectAllClasses().EndingWith("Service").BindDefaultInterface(); }); 
     kernel.Bind<LibraryDBContext>().ToSelf().InRequestScope(); 
     kernel.Bind<IBackgroundJobClient>().To<BackgroundJobClient>(); 
    }  

我沒有看到我的錯誤,你能幫助我嗎?

+0

你需要告訴ninject建立這種情況下,通常用'kernel.BindFilter (FilterScope.Action,NULL)完成的;'。但是我不知道如何將它應用到Hangfire儀表板。 – BatteryBackupUnit

+1

當您做了@BatteryBackupUnit關於註冊的說法後,將'AuthorizationFilters = new [] {new RestrictiveAuthorizationFilter()}'改爲'AuthorizationFilters = new [] {injectFilter}',並將'RestrictiveAuthorizationFilter injectedFilter'作爲參數。 – CrazyPyro

回答

0

您可以將內核作爲參數傳遞給RestrictiveAuthorizationFilter構造函數並請求IUserService。

public class RestrictiveAuthorizationFilter : IAuthorizationFilter 
{ 
    public IUserService _userService { get; set; } 

    public RestrictiveAuthorizationFilter(IKernel kernel) 
    { 
     _userService = kernel.Get<IUserService>() 
    } 

    public bool Authorize(IDictionary<string, object> owinEnvironment) 
    { 

     //do something with _userService but it is always null 

     return true; 
    } 
} 
+1

不好意思,但如果你編輯的話,還有一個等待你的提議。 這是「服務位置」作爲[反模式]的示例(http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/)而不是將'IKernel'作爲參數,你應該採取你真正想要的東西 - 'IUserService'。 (這一切都是爲了「構造函數注入」,因爲這個問題已經使用了一個'[Inject]'屬性用於「屬性注入」,所以這甚至不是必需的)。使這項工作的關鍵部分來自我的評論和@BatteryBackupUnit – CrazyPyro

+0

過濾器屬性實例將無限期地緩存每個操作,有效地使它們成爲單例。這使得它們不適用於DI,因爲屬性的依賴關係也會意外地提升爲單例,這可能會導致各種併發問題。 由於DI不是一個選項,建議使用其他機制。這裏基本上有兩種選擇。哪一個最好取決於應用程序需要的過濾器屬性的數量。如果屬性的數量有限(少數),最簡單的解決方案是在屬性中恢復到服務定位器模式。 –