我必須將Oauth與Autofac集成。但有些事情出錯了。我想我明白爲什麼,但我不知道如何解決它。我讓你看看我的代碼。通過Autofac 4.0配置OAuthAuthorizationServerProvider
我Autofac配置
{
builder.RegisterType<CustomAuthorizationServerProvider>()
.PropertiesAutowired()
.SingleInstance();
builder.RegisterType<MyBusinessObj>()
.As<IMyBusinessObj>()
.InstancePerRequest()
.PropertiesAutowired();
//IMySessionObj is a prop inside MyBusinessObj
builder.RegisterType<MySessionObj>()
.As<IMySessionObj>()
.InstancePerRequest()
.PropertiesAutowired();
//IMyUnitOfWorkObjis a prop inside MyBusinessObj
builder.RegisterType<MyUnitOfWorkObj>()
.As<IMyUnitOfWorkObj>()
.InstancePerRequest();
...
}
Startup.cs
我有經典配置加上我authorizationServerProvider
..分辨率正如你所看到的,我解決它在容器中。 ..因爲它是一個單身人士。
app.UseAutofacMiddleware(_container);
app.UseAutofacWebApi(config);
var oauthServerOptions = new OAuthAuthorizationServerOptions
{
...,
Provider = _container.Resolve<CustomAuthorizationServerProvider>()
};
app.UseOAuthAuthorizationServer(oauthServerOptions);
app.UseWebApi(config);
CustomAuthorizationServerProvider.cs
這是怎麼了我已經實現了我的CustomAuthorizationServerProvider
。
public class CustomAuthorizationServerProvider: OAuthAuthorizationServerProvider
{
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
var autofacLifetimeScope = OwinContextExtensions.GetAutofacLifetimeScope(context.OwinContext);
var myBusinessObj = autofacLifetimeScope.Resolve<IMyBusinessObj>();
var xxx = myBusinessObj.DoWork();
...
return Task.FromResult<object>(null);
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
var myBusinessObj = autofacLifetimeScope.Resolve<IMyBusinessObj>();
var xxx = myBusinessObj.DoWork();
...
context.Validated(ticket);
}
}
在這裏我解決了我的IMyBusinessObj
在lifetimescope中,而不是在容器中。這個對象負責(間接)連接到數據庫,訪問會話,訪問緩存等......所以它不能是單身。
我需要它會有一個生命週期的每個請求。 所以這裏的問題..我的配置有兩個問題。
我有一個
SingleInstance
對象內InstancePerRequest
對象。我不能這樣做。 Troubleshooting Per-Request Dependencies當我在啓動時配置oauth時,我實際上不能有一個
InstancePerRequest
對象...因爲在該上下文中不存在請求。
所以..我已經理解了哪些是我的問題。
任何想法或提示? 謝謝