Configurar la Unidad para DI ASP.NET Identidad

Estoy usando la Unidad correctamente para todos los regulares de la inyección de constructor como repositorios, etc., pero no puedo hacerlo funcionar con el ASP.NET la Identidad de las clases. La configuración es esta:

public class AccountController : ApiController
{
    private UserManager<ApplicationUser> _userManager { get; set; }

    public AccountController(UserManager<ApplicationUser> userManager)
    {
        if (userManager == null) { throw new ArgumentNullException("userManager"); }
        _userManager = userManager;
    }

    //...
}

con estas configuraciones de la Unidad:

unity.RegisterType<AccountController>();
unity.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager());
unity.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager());

Que es la misma que la de otras publicaciones aquí para Autofac, Ninject por ejemplo, pero no funciona en mi caso. El mensaje de error es:

Se ha producido un error al intentar crear un controlador de tipo ‘AccountController’. Asegúrese de que el controlador tiene un constructor público sin parámetros.
Manual de creación de obras de curso:

public AccountController()
    : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>("Mongo")))
{
}

Lo que está mal?

ACTUALIZACIÓN

Según lo sugerido por @emodendroket, acortando el código para que esto hace el truco. No hay necesidad de la Unidad.Mvc paquete.

unity.RegisterType<IUserStore<IdentityUser>, 
  MyCustomUserStore>(new HierarchicalLifetimeManager());

y

public AccountController(UserManager<IdentityUser> _userManager,
  IAccountRepository _account)
{
    //...
  • Mvc y web api utiliza diferentes interfaces para el DI. Nuget la última Unidad WebApi paquete de Microsoft P&P
  • Seguro? Sólo puedo ver las diferencias en el «arranque» de los paquetes y la 3ª parte de las bibliotecas, no la Unidad de paquete en sí.
  • ¿No se el interior de la excepción?
  • Instalar la Unidad.Mvc paquete. Además, no es necesario registrar el controlador. Ese mensaje parece sugerir que usted todavía está utilizando el controlador por defecto de fábrica, el cual la Unidad.Mvc debe ayudar con.
  • Si usted acaba de instalar la Unidad MVC paquete y tiene problemas con el ASP.NET Cuentas de Identidad del controlador, consulte aquí: stackoverflow.com/questions/20023065/…
InformationsquelleAutor Benjamin E. | 2014-02-21

4 Kommentare

  1. 21

    También se necesita para resolver el UserManager. El siguiente es un ejemplo de cómo podría hacer con el UserManager y la RoleManager. En este ejemplo yo uso regular de la Unidad 3 paquete en lugar de uno de los derivados o bootstrappers (tuvo algunos problemas con ellos en el pasado).

    AccountController

    private readonly UserManager<ApplicationUser> _userManager;
    
    private readonly RoleManager<IdentityRole> _roleManager;
    
    public AccountController(IUserStore<ApplicationUser> userStore, IRoleStore<IdentityRole> roleStore)
    {
      _userManager = new UserManager<ApplicationUser>(userStore);
      _roleManager = new RoleManager<IdentityRole>(roleStore);
    }

    Unidad De Arranque

    var accountInjectionConstructor = new InjectionConstructor(new IdentitySampleDbModelContext(configurationStore));
    container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(accountInjectionConstructor);
    container.RegisterType<IRoleStore<IdentityRole>, RoleStore<IdentityRole>>(accountInjectionConstructor);
    • Gracias, sólo la inyección de la UserStore obras. Pero, ¿por qué no voy a tratar de Unidad de inyectar el UserManager instancia así? Porque es de todos modos el marco y no el código que tengo para probar/reemplazar?
    • No es necesario. En realidad se puede inyectar estas cosas.
    • Podría usted comentar la congfigurationStore estás pasando?
    • Oh, extrañado de que se me pegue en. El configurationStore es una aplicación que uso para determinar si se me ejecuta localmente y pasan en mi archivo de configuración local o si me ejecutan en Azure (la mayoría de los trabajos que yo hago es Azure-relacionados) y el uso de la Azure archivo de configuración. Puede reemplazar el configurationStore con la conexión a la base de datos.
    • Yo estoy usando el código idéntico a usted y a la UserStore está inscrita bien, sin embargo, no va a compilar el RoleStore de registro. Error = El tipo de ‘Microsoft.AspNet.Identity.EntityFramework.RoleStore<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>’ no puede ser utilizado como parámetro de tipo ‘TTo’ en el tipo genérico o método ‘Microsoft.Practices.Unity.UnityContainerExtensions.RegisterType<TFrom,TTo>(Microsoft.Practices.Unity.IUnityContainer, parámetros de Microsoft.Prácticas.Unidad.InjectionMember[])’.
    • Creo que debe ser el contenedor.RegisterType<IRoleStore<IdentityRole, cadena>, RoleStore<IdentityRole>>(accountInjectionConstructor). La cadena de la parte que falta

  2. 14

    Como este blog de enterpriseframework.com dice:

    Primero, agregue la Unidad de Arranque para ASP.NET MVC paquete de Nuget.

    1. En su Visual Studio «Explorador de soluciones» > click derecho en el Web del proyecto «Referencias» de este nodo > haga clic en «Administrar Paquetes de NuGet».

    2. Desde el menú de la izquierda, elija en Línea > Todos los

    3. En la parte superior derecha cuadro de búsqueda > Buscar en Línea (Ctrl + E) > tipo de «Unidad de arranque para ASP.NET MVC».
    4. Seleccione «Unidad de Arranque para ASP.NET MVC» y elija Instalar.
    5. Haga clic en Cerrar después de la instalación completa

    A continuación, Modificar your-Web-project/App_Start/UnityConfig.cs archivo y actualización de la using declaraciones como la siguiente:

        using System;
        using System.Data.Entity;
        using Microsoft.AspNet.Identity;
        using Microsoft.AspNet.Identity.EntityFramework;
        using Microsoft.Practices.Unity;
        using Microsoft.Practices.Unity.Configuration;
        using MicrosoftIdentity.Controllers;
        using MicrosoftIdentity.Models;

    Finalmente, en el mismo archivo, actualización de RegisterTypes método a continuación:

            public static void RegisterTypes(IUnityContainer container)
            {
                //NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
                //container.LoadConfiguration();
    
                //TODO: Register your types here
                container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>();
                container.RegisterType<UserManager<ApplicationUser>>();
                container.RegisterType<DbContext, ApplicationDbContext>();
                container.RegisterType<ApplicationUserManager>();
                container.RegisterType<AccountController>(new InjectionConstructor());
            }

    HTH

  3. -1
    Install-Package Unity.AspNet.WebApi

    Usted necesita para registrar la Unidad bajo el HttpConfiguration.DependencyResolver de la propiedad. Esto permite WebApi saber que se necesita para usar la Unidad en vez de la reflexión a instancias de sus controladores.

    La manera más fácil de hacer esto es con el anterior paquete de nuget.

    • Unidad.AspNet.WebApi es sólo el andamiaje para la Unidad, además de que tiene una aplicación de IDependencyResolver. La unidad está funcionando bien, es sólo que no trabajan para clases específicas de ASP.NET de la Identidad. Sospecho que el problema está en UserManager, que probablemente estoy tratando de registrar en un camino equivocado.
  4. -1

    Reemplazar esta propiedad en el AccountController

    public ApplicationUserManager UserManager
    {
        get
        { 
            _userManager = new ApplicationUserManager(
                              new UserStore<ApplicationUser>(new ApplicationDbContext()));
            return _userManager ??
                   Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }
    • Por favor, considere la posibilidad de agregar alguna explicación de por qué esta respuesta es correcta, y mejor que las otras respuestas.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea