2016-04-12 6 views
1

У меня есть веб-приложение ASP.NET, которое использует Microsoft Identity 2.0 и Unity.Mvc для инъекции зависимостей.Включить Unity для разрешения зависимостей от OwinContext

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?

ответ

2

Для этой цели вы можете написать свой обычай 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; 
     } 
    } 
} 

Для получения дополнительной информации о регистрации UnityContainerExtensionsee this link

Смежные вопросы