gpt4 book ai didi

c# - 启用 Unity 以解决来自 OwinContext 的依赖项

转载 作者:太空宇宙 更新时间:2023-11-03 23:18:07 26 4
gpt4 key购买 nike

我有一个使用 Microsoft Identity 2.0 和 Unity.Mvc 进行依赖注入(inject)的 ASP.NET Web 应用程序。

Microsoft Identity 2.0 在 OwinContext 中注册了 UserManagerSignInManager 并依赖于 HttpContext

我想在 ManageController 中注入(inject)这些

class ManageController
{
public ManageController(IUserManager userManager, ISignInManager signInManager)
{
}
}

然而,这引发了一个异常,因为它们尚未在 UnityContainer 中注册。

我还没有在 UnityContainer 中找到任何方法来向通过委托(delegate)初始化的对象注册类型。类似的东西

container.RegisterInstance<IUserManager>(() => HttpContext.Current.GetOwinContext().GetUserManager<UserManager>());

我还尝试从 OwinContext 获取实例并在 UnityContainer 中注册它

var userManager = HttpContext.Current.GetOwinContext().GetUserManager<UserManager>();
container.RegisterInstance<IUserManager>(userManager);

但是 HttpContext.Currentnull

有没有自定义 UnityContainer 类型映射行为的方法?

最佳答案

为此,您可以编写自定义 UnityContainerExtension,并在该扩展中使用 UnityBuildStage.TypeMapping 添加新策略,在该策略中,您可以覆盖 PreBuildUp 方法和解析来自 OwinContext

的类型

我在自己的项目中是这样做的:

public class IdentityResolutionExtension : UnityContainerExtension
{
public IdentityResolutionExtension(Func<IOwinContext> getOwinContext)
{
GetOwinContext = getOwinContext;
}

protected Func<IOwinContext> GetOwinContext { get; }

protected override void Initialize()
{
Context.Strategies.Add(new IdentityTypeMappingStrategy(GetOwinContext), UnityBuildStage.TypeMapping);
}

class IdentityTypeMappingStrategy : BuilderStrategy
{
private readonly Func<IOwinContext> _getOwinContext;

private static readonly MethodInfo IdentityTypeResolverMethodInfo =
typeof (OwinContextExtensions).GetMethod("Get");

public IdentityTypeMappingStrategy(Func<IOwinContext> getOwinContext)
{
_getOwinContext = getOwinContext;
}

public override void PreBuildUp(IBuilderContext context)
{
if (context.BuildComplete || context.Existing != null)
return;

var resolver = IdentityTypeResolverMethodInfo.MakeGenericMethod(context.BuildKey.Type);
var results = resolver.Invoke(null, new object[]
{
_getOwinContext()
});

context.Existing = results;
context.BuildComplete = results != null;
}
}
}

有关注册 UnityContainerExtension 的更多信息 see this link

关于c# - 启用 Unity 以解决来自 OwinContext 的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36570669/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com