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!

Foi útil?

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());
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top