将IOwinContext注入我的OAuthAuthorizationServerProvider时遇到问题。

在我的Startup.cs中,我有一行:

 public static IContainer ConfigureContainer(Type mvcApplication, HttpConfiguration configuration = null)
    {
        var builder = new ContainerBuilder();
        //other stuff
        builder
          .Register(ctx=>HttpContext.Current.GetOwinContext())
          .As<IOwinContext>();
        //other stuff
      app.UseAutofacMiddleware(container);
      app.UseAutofacWebApi(configuration);
      app.UseWebApi(configuration);
}


在我的提供者中,我这样做:

 public class  ApplicationOAuthProvider : OAuthAuthorizationServerProvider{

     public ApplicationOAuthProvider(IComponentContext context)
    {
        _ccontext = context;
    }

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
           var logger = _ccontext.Resolve<EventLoggerService>();
    }

 }


上面的行崩溃是因为我有一个需要IOwinContext的注射剂。错误是:


  :Autofac.Core.DependencyResolutionException:找不到类型为“ Assistant.Framework.Services.CurrentUserService”的,带有“ Autofac.Core.Activators.Reflection.DefaultConstructorFinder”的构造函数:
  无法解析构造函数“ Void .ctor(Microsoft.Owin.IOwinContext)”的参数“ Microsoft.Owin.IOwinContext上下文”。

最佳答案

简洁版本

如果使用Autofac and Web API integration using OWIN,则无需自己在容器中注册IOwinContext

集成软件包Autofac.WebApi2.Owin为您完成了此任务。您要做的就是将IOwinContext注入到您想注入的任何位置,并且可以立即使用,如您在this repo on GitHub上看到的那样

较长的版本,又称“这是怎么发生的?”

原因是,使用OWIN integration package for Autofac时,IOwinContext在每个请求生命周期范围内自动注册。当您在this file中调用app.UseAutofac(container)时,魔术就会发生,这是代码的摘录:

private static IAppBuilder RegisterAutofacLifetimeScopeInjector(this IAppBuilder app, ILifetimeScope container)
{
    app.Use(async (context, next) =>
        {
            using (var lifetimeScope = container.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag,
            b => b.RegisterInstance(context).As<IOwinContext>()))
            {
                context.Set(Constants.OwinLifetimeScopeKey, lifetimeScope);
                await next();
            }
        });

    app.Properties[InjectorRegisteredKey] = true;
    return app;
}


在OWIN管道中注册了一个匿名中间件,该中间件执行3件事:


为当前的HTTP请求创建一个新的生存期范围
在该新生存期范围内注册当前IOwinContext
将当前生存期范围存储在IOwinContext


所有这些都意味着在您的Web API应用程序中解析服务的生存期作用域已经知道如何注入IOwinService,因此您无需进行任何其他工作。

10-08 08:15