我有一个ASP.NET Web应用程序,该应用程序使用Microsoft Identity 2.0和Unity.Mvc进行依赖项注入。

Microsoft Identity 2.0在UserManager中注册SignInManagerOwinContext,并且依赖于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.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/

10-11 06:08