2016-04-12 8 views
1

Ich habe eine ASP.NET-Webanwendung, die Microsoft Identity 2.0 und Unity.Mvc für die Abhängigkeitsinjektion verwendet.Aktivieren Sie Unity, um Abhängigkeiten von OwinContext zu beheben

Microsoft Identity 2.0 registriert UserManager und SignInManager innerhalb OwinContext und ist abhängig von HttpContext.

Ich möchte diese injizieren innerhalb ManageController

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

jedoch, die eine Ausnahme, da diese wirft noch nicht in UnityContainer registriert.

Ich habe keine Methode innerhalb UnityContainer gefunden, um den Typ mit Objekt zu registrieren, das über Delegat initialisiert wurde. etwas wie die

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

Ich habe auch versucht Beispiel von OwinContext zu erhalten und registrieren, dass innerhalb UnityContainer

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

jedoch HttpContext.Current ist null.

Gibt es sowieso anpassen UnityContainer Typ Mapping-Verhalten?

Antwort

2

Zu diesem Zweck können Sie Ihre individuelle UnityContainerExtension schreiben und innerhalb dieser Erweiterung neue Strategie hinzufügen mit UnityBuildStage.TypeMapping, im Rahmen dieser Strategie können Sie PreBuildUp Methode überschreiben und lösen Art von OwinContext

Dies ist, wie ich es getan hätte in meinem eigenen Projekt:

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; 
     } 
    } 
} 

weitere Informationen über UnityContainerExtensionsee this link

Registrierung
Verwandte Themen