【发布时间】:2017-07-18 07:25:40
【问题描述】:
我有一个多租户 MVC5 webapp,它使用 Autofac v3.5.2 和 Autofac.Mvc5 v3.3.4。
我的 Autofac DI 连接发生在我的 MVC 项目中的一个类中。对于身份验证,我们使用OWIN OpenId middleware 与 Azure B2C 集成。在 OWIN Startup 类中,我需要一个依赖项来使用当前请求中的信息设置tenantId/clientId。
我尝试通过以下方式获取依赖项:
DependencyResolver.Current.GetService<...>();
但是,这总是会抛出 ObjectDisposedException
无法解析实例,并且无法从此 LifetimeScope 创建嵌套生命周期,因为它已被释放。
我们的应用程序中有一个具有请求生命周期的 ISiteContext。它填充了特定于当前请求的配置值。我正在尝试像这样获取这些值:
private OpenIdConnectAuthenticationOptions CreateOptionsFromPolicy(string policy)
{
var options = new OpenIdConnectAuthenticationOptions
{
Notifications = new OpenIdConnectAuthenticationNotifications
{
...
RedirectToIdentityProvider = SetSettingsForRequest
}
}
}
private Task SetSettingsForRequest(RedirectToIdentityProviderNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> context)
{
var siteContext = DependencyResolver.Current.GetService<ISiteContext>();
context.ProtocolMessage.ClientId = siteContext.ClientId;
return Task.FromResult(0);
}
尝试在 SetSettingsForRequest 中使用 DependencyResolver 时发生错误。我不知道我在这里做错了什么。目前我的 Startup Configuration(IAppBuilder app) 方法中没有 Autofac DI 设置,因为这已经在我的 MVC 项目中设置。
【问题讨论】:
-
你能分享更多代码吗?您是如何尝试获得
tenantId的? -
@CyrilDurand 我添加了一个代码示例,显示我试图解决依赖关系以获取每个请求的 clientId