Cómo inyectar webapi AccountController en WebApi
Tengo un constructor y constructor predeterminado con parámetros como aquí:
public class AccountController : ApiController
{
private const string LocalLoginProvider = "Local";
private ApplicationUserManager _userManager;
public ISecureDataFormat<AuthenticationTicket> AccessTokenFormat { get; private set; }
[Dependency]
public IRepository Repository{ get; private set; }
public AccountController()
{
}
public AccountController(ApplicationUserManager userManager, ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
{
_userManager = userManager;
AccessTokenFormat = accessTokenFormat;
}
}
Y mi configuración de unidad aquí:
.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager())
.RegisterType<UserManager<ApplicationUser, int>, ApplicationUserManager>()
.RegisterType<ApplicationDbContext>(new HierarchicalLifetimeManager())
.RegisterType<ApplicationUserManager>()
.RegisterType<ISecureDataFormat<AuthenticationTicket>, SecureDataFormat<AuthenticationTicket>>()
.RegisterType<ITextEncoder, Base64UrlTextEncoder>()
.RegisterType<IDataSerializer<AuthenticationTicket>, TicketSerializer>()
//.RegisterType<IDataProtector>(() => new DpapiDataProtectionProvider().Create("ASP.NET Identity"))
.RegisterType<IUserStore<ApplicationUser, int>, CustomUserStore>(new InjectionConstructor(typeof(ApplicationDbContext)))
.RegisterType<IAuthenticationManager>(new InjectionFactory(o => HttpContext.Current.GetOwinContext().Authentication))
.RegisterType<IOwinContext>(new InjectionFactory(o => HttpContext.Current.GetOwinContext()))
.RegisterType<IRepository, Repository>();
Pero el problema es que siempre se llama al constructor predeterminado. Leo este artículoBlog pero no hablan de cómo resolver tal caso con el constructor que tiene parámetrosAccountController(ApplicationUserManager userManager, ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
Si estoy quitando el constructor sin parámetros, obtengo un error:"An error occurred when trying to create a controller of type 'AccountController'. Make sure that the controller has a parameterless public constructor.",
¿Hay alguien que pueda ayudar?
También tengo ApiController normal y no me inyectan también:
public class MyController : ApiController
{
[Dependency]
public IRepository Repository { get; set; }
public IHttpActionResult Get()
{
var test = Repository.GetSomething(); // Repository is null here always
}
}
ACTUALIZACIÓN 1 Basado en @IgorPashchuk sugerencia ahoraMyController
se está inyectando ahora. Pero AccoutController no lo es. Me quitaron el constructor predeterminado pero sigo recibiendo el error.
ACTUALIZACIÓN 2 Altero el constructor con parámetros sacando el segundo parámetro:
public class AccountController : ApiController
{
private const string LocalLoginProvider = "Local";
private ApplicationUserManager _userManager;
[Dependency]
public IRepository Repository{ get; private set; }
public AccountController(ApplicationUserManager userManager)
{
_userManager = userManager;
}
}
De esta manera, tengo la cosa funcionando. ¿Entiendo que eso significa que Unity no pudo construir el tipoISecureDataFormat<AuthenticationTicket>
. Publico otra pregunta sobre este temaCómo construir ISecureDataFormat <AuthenticationTicket> con unit