Configurar Unity DI para Identidad ASP.NET

Estoy usando Unity con éxito para todas las inyecciones de constructores habituales, como repositorys, etc., pero no puedo hacerlo funcionar con las clases de Identidad de ASP.NET. La configuración es esta:

public class AccountController : ApiController { private UserManager _userManager { get; set; } public AccountController(UserManager userManager) { if (userManager == null) { throw new ArgumentNullException("userManager"); } _userManager = userManager; } // ... } 

con estas configuraciones para Unity:

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

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

Se produjo un error al intentar crear un controlador de tipo ‘AccountController’. Asegúrese de que el controlador tenga un constructor público sin parámetros. La creación manual funciona, por supuesto:

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

¿Qué pasa?

ACTUALIZAR

Como lo sugiere @emodendroket, acortar el código a esto hace el truco. No es necesario el paquete Unity.Mvc.

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

y

 public AccountController(UserManager _userManager, IAccountRepository _account) { // ... 

También necesita resolver el UserManager . El siguiente es un ejemplo de cómo puede hacerlo con el UserManager y el RoleManager . En esta muestra utilizo el paquete regular de Unity 3 en lugar de uno de los derivados o bootstrappers (tuve algunos problemas con ellos en el pasado).

AccountController

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

Unity Bootstrapper

 var accountInjectionConstructor = new InjectionConstructor(new IdentitySampleDbModelContext(configurationStore)); container.RegisterType, UserStore>(accountInjectionConstructor); container.RegisterType, RoleStore>(accountInjectionConstructor); 

Como dice esta publicación de blog de enterpriseframework.com :

Primero, agregue el Unity Bootstrapper para el paquete ASP.NET MVC Nuget.

  1. En su “Explorador de soluciones” de Visual Studio> haga clic con el botón derecho en el nodo “Referencias” de su proyecto web> haga clic en “Administrar paquetes NuGet”.

  2. En el menú de la izquierda, selecciona En línea> Todos

  3. En el cuadro de búsqueda de la esquina superior derecha> Buscar en línea (Ctrl + E)> escriba “Unity bootstrapper for ASP.NET MVC”.
  4. Seleccione “Unity Bootstrapper para ASP.NET MVC” y elija Instalar.
  5. Haga clic en Cerrar después de completar la instalación

A continuación, modifique your-Web-project/App_Start/UnityConfig.cs archivo your-Web-project/App_Start/UnityConfig.cs y actualice las instrucciones de using siguiente manera:

  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, actualice el método RegisterTypes siguiente manera:

  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, UserStore>(); container.RegisterType>(); container.RegisterType(); container.RegisterType(); container.RegisterType(new InjectionConstructor()); } 

HTH

 Install-Package Unity.AspNet.WebApi 

HttpConfiguration.DependencyResolver registrar Unity en la propiedad HttpConfiguration.DependencyResolver . Esto le permite a WebApi saber que necesita usar Unity en lugar de reflexión para instanciar sus controladores.

La forma más fácil de hacerlo es con el paquete nuget anterior.

Reemplace esta propiedad en AccountController

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