2015-04-12 64 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); 
    } 
}