Como adicionar autenticação MVC 5 ao Unity IoC?
-
21-12-2019 - |
Pergunta
Atualmente estou trabalhando na implementação da nova autenticação pronta para uso do ASP.NET MVC 5 em meu aplicativo.No entanto, ao usar o Unity como meu IoC, não consigo usar nenhuma parte do AccountController porque recebo o erro:
O tipo IUserStore`1 não possui um construtor acessível.
Esta é a minha configuração de unidade fornecida, chamada em global.asax
public class DependencyConfig
{
public static void Initialise()
{
var container = BuildUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();
// register all your components with the container here
// it is NOT necessary to register your controllers
container.RegisterType<IEmployeeRepository, EmployeeRepository>();
container.RegisterType<ITeamRepository, TeamRepository>();
container.RegisterType<ICompanyRepository, CompanyRepository>();
return container;
}
}
E aqui estão os construtores padrão de um novo AccountController.cs
public AccountController()
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new BusinessTrackerUsersContext())))
{
}
public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
}
public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
}
E aqui estão os itens sendo chamados nos construtores AccountController.Estes são os padrões com novos nomes.
public class BusinessTrackerUsersContext : IdentityDbContext<ApplicationUser>
{
public BusinessTrackerUsersContext()
: base("DefaultConnection")
{
}
}
public class ApplicationUser : IdentityUser
{
}
Qualquer ajuda seria muito apreciada!
Solução
Como você tem dois construtores em seu controlador, a unidade escolherá aquele com lista de parâmetros mais longa, o último.Requer que o UserManager seja injetado.
Embora você não o tenha listado aqui, suspeito que ele tenha apenas um construtor que requer o IUserStore.O Unity tentou resolvê-lo e não conseguiu encontrar nenhum construtor que pudesse usar diretamente ou resolver seus parâmetros.
Outras dicas
Concordo com Wiktor.
Você poderia registrar o construtor sem parâmetros com o Unity e impedir que ele usasse o parâmetro mais longo fazendo o seguinte:
container.RegisterType<AccountController>(new InjectionConstructor());