2015-04-12 67 views
3

我不能找出解決經由Autofac一種服務,用於在構造的Owin上下文,並且還設置在請求端以正確的方式。解決Autofac服務上Owin啓動

由於OwinContext目前仍在建設中,因此無法通過致電HttpContext.Current.GetOwinContext().GetAutofacLifetimeScope()找到LifetimeScope。 OwinContext尚未在此處提供。

在我的代碼中,IAdfsAuthorizationProvider服務直接在Container上解析,但不會在請求後處理並且壽命更長。

我可以通過調用container.BeginLifetimeScope()來創建一個新的LifeTimeScope,但現在生命期被分開了請求,並且可能會解析同一請求中的不同實例。而且我無法在正確的時間處理lifeTimeScope。

public void Configure(IAppBuilder app) 
    { 
     var builder = new ContainerBuilder();  
     builder.RegisterType<AdfsAuthorizationProvider>().As<IAdfsAuthorizationProvider>().InstancePerLifetimeScope(); 

     var container = builder.Build(); 

     app.UseAutofacMiddleware(container); 

     // **Service that's not binding to the request lifetime.** 
     var service = container.Resolve<IAdfsAuthorizationProvider>(); 

     app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions 
      { 
       Provider = new AuthorizationServerProvider(service), 
      });   
      } 

有沒有人有建議?

回答

11

OAuthAuthorizationServerProvider是一個單身人士,它調用所有請求的方法。

這個類沒有被設計爲注入。如果你想解決一個請求的依賴關係,你將不得不使用每種方法提供的owinContext手動解析它

public class AuthorizationServerProvider : OAuthAuthorizationServerProvider 
{ 
    public override Task GrantAuthorizationCode(
     OAuthGrantAuthorizationCodeContext context) 
    { 
     IAdfsAuthorizationProvider authorizationProvider = 
      context.OwinContext 
        .GetAutofacLifetimeScope() 
        .Resolve<IAdfsAuthorizationProvider>(); 

     return base.GrantAuthorizationCode(context); 
    } 
}