LightInject - 调用 WebApi OWIN Identity TokenEndpointPath 时没有作用域
LightInject - No scope when calling WebApi OWIN Identity TokenEndpointPath
我有一个非常基本的带有令牌身份验证的 WebAPI 设置。
在应用程序开始时我这样做:
protected void Application_Start()
{
DependencyConfig.RegisterDependecis();
//...
//...
}
调用:
public class DependencyConfig
{
private static ServiceContainer _LightInjectContainer;
public static ServiceContainer LightInjectContainer
{
get { return _LightInjectContainer; }
}
public static void RegisterDependecis()
{
var container = new LightInject.ServiceContainer();
container.RegisterApiControllers();
container.ScopeManagerProvider = new PerLogicalCallContextScopeManagerProvider();
container.EnableWebApi(GlobalConfiguration.Configuration);
container.Register<IRegistrationManager, RegistrationManager>(new PerScopeLifetime());
_LightInjectContainer = container;
}
}
现在,当客户端调用令牌端点(请求令牌)时,我在这里定义的提供者:
OAuthOptions = new OAuthAuthorizationServerOptions
{
//...
//...
Provider = new SimpleAuthorizationServerProvider()
//...
//...
};
正在使用此方法:
public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
//...
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
//...
// Here I get the exception!
var registrationManager = DependencyConfig.LightInjectContainer.GetInstance<IRegistrationManager>();
//...
}
//...
}
当我尝试获取实例时出现以下错误:
Attempt to create a scoped instance without a current scope.
我知道 LightInject 对每个请求都有一个 Start/End 作用域的概念,它实际上告诉我没有启动作用域。但我似乎无法弄清楚究竟是什么坏了,需要修复。
我是 LightInject 的作者
你能在你的处理程序中试试这个吗(SimpleAuthorizationServerProvider)
request.GetDependencyScope().GetService(typeof(IRegistrationManager)) as IRegistrationManager;
实际上没有理由将容器公开为静态 public 成员,因为这使得开始使用服务定位器反模式变得非常容易。
查看此博客 post 了解更多信息。
http://www.strathweb.com/2012/11/asp-net-web-api-and-dependencies-in-request-scope/
通过阅读 this 问题的最后答案,我想到了这个解决方案:(手动启动范围)
using(DependencyConfig.LightInjectContainer.BeginScope())
{
IRegistrationManager manager = DependencyConfig.LightInjectContainer.GetInstance<IRegistrationManager>();
}
技术上它有效,但我不确定它是否是关于幕后发生的事情的正确解决方案。
我有一个非常基本的带有令牌身份验证的 WebAPI 设置。
在应用程序开始时我这样做:
protected void Application_Start()
{
DependencyConfig.RegisterDependecis();
//...
//...
}
调用:
public class DependencyConfig
{
private static ServiceContainer _LightInjectContainer;
public static ServiceContainer LightInjectContainer
{
get { return _LightInjectContainer; }
}
public static void RegisterDependecis()
{
var container = new LightInject.ServiceContainer();
container.RegisterApiControllers();
container.ScopeManagerProvider = new PerLogicalCallContextScopeManagerProvider();
container.EnableWebApi(GlobalConfiguration.Configuration);
container.Register<IRegistrationManager, RegistrationManager>(new PerScopeLifetime());
_LightInjectContainer = container;
}
}
现在,当客户端调用令牌端点(请求令牌)时,我在这里定义的提供者:
OAuthOptions = new OAuthAuthorizationServerOptions
{
//...
//...
Provider = new SimpleAuthorizationServerProvider()
//...
//...
};
正在使用此方法:
public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
//...
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
//...
// Here I get the exception!
var registrationManager = DependencyConfig.LightInjectContainer.GetInstance<IRegistrationManager>();
//...
}
//...
}
当我尝试获取实例时出现以下错误:
Attempt to create a scoped instance without a current scope.
我知道 LightInject 对每个请求都有一个 Start/End 作用域的概念,它实际上告诉我没有启动作用域。但我似乎无法弄清楚究竟是什么坏了,需要修复。
我是 LightInject 的作者
你能在你的处理程序中试试这个吗(SimpleAuthorizationServerProvider)
request.GetDependencyScope().GetService(typeof(IRegistrationManager)) as IRegistrationManager;
实际上没有理由将容器公开为静态 public 成员,因为这使得开始使用服务定位器反模式变得非常容易。
查看此博客 post 了解更多信息。
http://www.strathweb.com/2012/11/asp-net-web-api-and-dependencies-in-request-scope/
通过阅读 this 问题的最后答案,我想到了这个解决方案:(手动启动范围)
using(DependencyConfig.LightInjectContainer.BeginScope())
{
IRegistrationManager manager = DependencyConfig.LightInjectContainer.GetInstance<IRegistrationManager>();
}
技术上它有效,但我不确定它是否是关于幕后发生的事情的正确解决方案。