Comment ajouter l'authentification MVC 5 à Unity IoC?

Je travaille actuellement sur la mise en œuvre du nouveau ASP.NET MVC 5 authentification prête à l'emploi dans mon application. Cependant, lorsque vous utilisez Unity comme IoC, Je ne peux utiliser aucune partie du AccountController car on me donne l'erreur:

Le type IUserStore`1 n'a pas de constructeur accessible.

C'est ma configuration d'unité donnée qui est appelée dans le 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;
    }
}

Et voici les constructeurs par défaut d'un 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;
}

Et voici les éléments appelés dans les constructeurs AccountController. Ce sont les valeurs par défaut avec de nouveaux noms.

public class BusinessTrackerUsersContext : IdentityDbContext<ApplicationUser>
{
    public BusinessTrackerUsersContext()
        : base("DefaultConnection")
    {

    }
}

public class ApplicationUser : IdentityUser
{

}

Toute aide serait largement appréciée!

22
demandé sur puretppc 2013-11-16 23:53:29

2 réponses

Parce que vous avez deux constructeurs sur votre contrôleur, unity sélectionnera celui avec une liste de paramètres plus longue, la dernière. Il nécessite L'UserManager à injecter.

Bien que vous ne l'ayez pas listé ici, je soupçonne qu'il a un seul constructeur qui nécessite le IUserStore. Unity a essayé de le résoudre et ne peut trouver aucun constructeur qu'il pourrait utiliser directement ou résoudre ses paramètres.

23
répondu Wiktor Zychla 2013-11-16 20:19:34

Je suis D'accord avec Wiktor.

Vous pouvez enregistrer le constructeur sans paramètre avec Unity et l'arrêter en prenant le paramètre plus long en faisant ceci:

container.RegisterType<AccountController>(new InjectionConstructor());
33
répondu hutchonoid 2013-11-16 21:24:09