将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
,因此您无需进行任何其他工作。