我有一个非常基本的WebAPI设置和令牌认证。
在应用程序开始我做的:
LightInject - 调用WebApi时没有作用域OWIN标识TokenEndpointPath
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有开始/结束范围为每个请求的概念,它实际上是在告诉我,没有规模启动。但我似乎无法确定究竟是什么坏了,需要修复。
这将工作,除非您在管道中稍后请求另一个IRegistrationManager并期望它相同。范围是嵌套的,并且Web API将为您的控制器创建另一个范围。 – seesharper
好的,但似乎是唯一的出路。您在另一个问题中回答的解决方案不起作用... –
如果您查看LightInject.WebApi的文档,有一个示例shat显示如何使HttpRequestMessage在控制器外部可用。如果你根据这个例子实现这个,你应该能够到达HttpRequestMessage然后是DepenencyResolver。 http://www.lightinject.net/#webapi – seesharper