我有一个ASP.NET Web应用程序,该应用程序使用Microsoft Identity 2.0和Unity.Mvc进行依赖项注入。
Microsoft Identity 2.0在UserManager
中注册SignInManager
和OwinContext
,并且依赖于HttpContext
。
我想将它们注入ManageController
class ManageController
{
public ManageController(IUserManager userManager, ISignInManager signInManager)
{
}
}
但是,这引起了一个异常,因为这些尚未在
UnityContainer
中注册。我没有找到
UnityContainer
中的任何方法来通过委托初始化的对象注册类型。这样的东西container.RegisterInstance<IUserManager>(() => HttpContext.Current.GetOwinContext().GetUserManager<UserManager>());
我还尝试从OwinContext获取实例并在
UnityContainer
中注册该实例var userManager = HttpContext.Current.GetOwinContext().GetUserManager<UserManager>();
container.RegisterInstance<IUserManager>(userManager);
但是
HttpContext.Current
是null
。无论如何,有没有自定义
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/