7

ich ApplicationUserManager wie folgt definiert haben zu injizieren:Wie ApplicationUserManager mit Einheit

public class ApplicationUserManager : UserManager<ApplicationUser, int> 
    { 
     public ApplicationUserManager(IUserStore<ApplicationUser, int> store) 
     : base(store) 
     { 
     } 

     public override Task<IdentityResult> CreateAsync(ApplicationUser user, string password) 
     { 
      var result = base.CreateAsync(user, password); 
      //... 
      Repository.DoSomething(...); //Repository is null here 
      //.. 
     }   

     [Dependency] 
     public IRepository Repository { get; set; } 
    } 

injiziert Aus irgendeinem Grund mein Repository in nicht bekommen. Repository ist immer null

Ich habe auch diese Zeile in meiner Einheit Konfiguration

.RegisterType<ApplicationUserManager>(new HierarchicalLifetimeManager()) 

Wie es injiziert machen?

UPDATE N:

Dies ist Code von meinem Controller; Wie ich UserManager bin immer:

public ApplicationUserManager UserManager 
{ 
    get 
    { 
     return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
    } 
    private set 
    { 
     _userManager = value; 
    } 
} 

public async Task<IHttpActionResult> Register(RegisterBindingModel model) 
    { 
     var user = new ApplicationUser() { UserName = model.Email, Email = model.Email }; 
     //calling my implemintation 
     IdentityResult result = await UserManager.CreateAsync(...); 
    } 

Meine aktuelle Einheit Config

.RegisterType<IUserStore<ApplicationUser, int>, CustomUserStore>(new HierarchicalLifetimeManager()) 
.RegisterType<IAuthenticationManager>(new InjectionFactory(o => HttpContext.Current.GetOwinContext().Authentication)) 
.RegisterType<UserManager<ApplicationUser, int>, ApplicationUserManager>() 
.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager()) 
.RegisterType<AccountController>(new InjectionConstructor()) 
.RegisterType<ApplicationDbContext>(new HierarchicalLifetimeManager()) 
.RegisterType<ApplicationUserManager>() 

UPDATE N + 1:

Wie ich Unity.Mvc Paket herausfinden, ist nicht WebAPI Controller zu injizieren. Ich habe diese method verwendet, um WebApi-Controller zu injizieren. Ich habe versucht, Unity.Mvc Paket zu entfernen, aber Identity warf Fehler. Von meinem Verständnis, weil Unity war nicht in der Lage, einige Identity types zu instanziieren, aber sie wurden konfiguriert und arbeitete im Falle der Einstellung Mvc Container. Also brachte ich das Unity.Mvc Paket zurück, um meine Identity types zu injizieren. Ansonsten, wie ich oben erklärt habe, wirft es verschiedene Art auf Nullreferenzen, wenn UnityIdentity types löst.

So habe ich zwei Container jetzt in meinem Projekt Unity.Mvc Injektion DependencyResolver.SetResolver(new UnityDependencyResolver(container)); die Identity types und benutzerdefinierte WebApi Injektion config.DependencyResolver = new UnityResolver(container); Behälter zu lösen benötigt, die WebApi contorllers zu injizieren benötigt beide gleiche UnityConfig verwenden.

UPDATE 3:

Ich habe geändert dieses:

app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>()); 

dazu

app.CreatePerOwinContext(() => UnityConfig.GetConfiguredContainer().Resolve<ApplicationUserManager>()); 

in Startup.ConfigureAuth() und jetzt habe ich meine WebAPI Container ist voll funktionsfähig und Konstruktion alle erforderlich Identity types so kann ich Mvc-Container deaktivieren oder sogar komplett rem Ove Unity.Mvc Paket.

Danke an @Sam Farajpour Ghamari für das Pflegen vieler Dinge.

+0

Wie greifen Sie auf die Objektinstanz "ApplicationUserManager" zu? –

+0

@SamFarajpourGhamari ja Ich kann eingeben, um meine benutzerdefinierte 'CreateAsync()' Methode zu debuggen. Aber 'Repository' ist nicht injiziert und gleich 'null' – sreginogemoh

+0

Erhalten Sie Instanz des Objekts durch Aufruf von' HttpContext.GetOwinContext(). Get () 'Methode? –

Antwort

17

Da Sie UserManager mit OWIN verwenden. Sie müssen OWIN-Container mit Einheit integrieren. Wo ich deinen anderen Teil von Codes nicht besonders OWIN Startmethode sehe. Ich zeige ein einfaches Beispiel, um zu demonstrieren, wie Sie das selbst machen können.

Zuerst, wenn Sie Entity Framework verwenden, müssen Sie Ihren Kontext für die Einheit registrieren. Zweites Register andere Art, die Identität sie so braucht:

container.RegisterType<DbContext, MyDbContext>(new PerRequestLifetimeManager()); 
container.RegisterType<IUserStore<ApplicationUser>, 
    UserStore<ApplicationUser>>(new PerRequestLifetimeManager()); 
container.RegisterType<ApplicationUserManager>(new PerRequestLifetimeManager()); 
container.RegisterType<IAuthenticationManager>(
    new InjectionFactory(c => HttpContext.Current.GetOwinContext().Authentication)) 
container.RegisterType<ApplicationSignInManager>(new PerRequestLifetimeManager()); 

Dann Konstruktor ApplicationUserManager wie folgt ändern:

public ApplicationUserManager(IUserStore<ApplicationUser> store, 
    IRepository repo) 
     : base(store) 
{ 
    this.Repository=repo; 
    // put your other configuration here instead of putting in 
    // static ApplicationUserManagerCreate() method. 
    this.UserValidator = new UserValidator<ApplicationUser>(this) 
    { 
     AllowOnlyAlphanumericUserNames = false, 
     RequireUniqueEmail = true 
    }; 
     // Configure validation logic for passwords 
    this.PasswordValidator = new PasswordValidator 
    { 
     RequiredLength = 6, 
     RequireNonLetterOrDigit = true, 
     RequireDigit = true, 
     RequireLowercase = true, 
     RequireUppercase = true, 
    }; 

     // Configure user lockout defaults 
    this.UserLockoutEnabledByDefault = true; 
    this.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5); 
    this.MaxFailedAccessAttemptsBeforeLockout = 5; 

    // and your other configurations 
} 

Jetzt in Ihren Startup.ConfigureAuth() Methode ändert folgende Zeilen:

public void ConfigureAuth(IAppBuilder app) 
{ 
    app.CreatePerOwinContext(EFDbContext.Create); 
    app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 
    app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); 
    // others 
} 

zu :

public void ConfigureAuth(IAppBuilder app) 
{ 
    app.CreatePerOwinContext(()=> DependencyResolver.Current.GetService<ApplicationUserManager>()); 
    app.CreatePerOwinContext(()=> DependencyResolver.Current.GetService<ApplicationSignInManager>()); 
    // other configs 
} 

Auch wir brauchen ApplicationUserManager Create() und ApplicationSignInManager.Create() Methoden nicht mehr und wir könnten sie leicht entfernen, da Unity die Verantwortung übernimmt, unsere Klassen jetzt zu erstellen.

Jetzt integrieren wir Identität vollständig mit Einheit. Für weitere und komplexe Informationen empfehle ich Ihnen zu lesen this awesome blog post.

+0

Ich erstelle 'ApplicationUserManager' so: 'var manager = new ApplicationUserManager (neuer CustomUserStore (context.Get ()));' - das ist Code von 'IdentityConfig.cs'. Wie würde es aussehen, wenn ich die Konstruktormethode wie oben beschrieben ändere? – sreginogemoh

+0

Erstellen Sie Ihren Benutzermanager innerhalb der statischen 'ApplicationUserManager.Create()' Methode? –

+0

Da wir möchten, dass Unity den Benutzer-Manager erstellt, brauchen wir die 'ApplicationUserManager.Create() 'Methode nicht mehr. Kopieren Sie einfach Ihre Konfiguration von dieser Methode in einen 'ApplicationUserManager' mit Ausnahme von' var manager = new ApplicationUserManager (neuer CustomUserStore (context.Get ())); 'line since useless now –