Как добавить аутентификацию MVC 5 в Unity IoC?
В настоящее время я работаю над реализацией новой аутентификации ASP.NET MVC 5 в своем приложении. Однако при использовании Unity в качестве IoC я не могу использовать какую-либо часть AccountController, потому что мне дана ошибка:
Тип IUserStore`1 не имеет доступного конструктора.
Это моя заданная установка единства, которая вызывается в 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;
}
}
И вот конструкторы по умолчанию для нового 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;
}
И вот элементы, вызываемые в конструкторах AccountController. Это значения по умолчанию с новыми именами.
public class BusinessTrackerUsersContext : IdentityDbContext<ApplicationUser>
{
public BusinessTrackerUsersContext()
: base("DefaultConnection")
{
}
}
public class ApplicationUser : IdentityUser
{
}
Любая помощь будет широко оценена!
Ответы
Ответ 1
Поскольку у вас есть два конструктора на вашем контроллере, единство подберет тот, у которого есть более длинный список параметров, последний. Это требует, чтобы UserManager был введен.
Хотя вы не указали его здесь, я подозреваю, что у него есть единственный конструктор, который требует IUserStore. Unity попыталась разрешить его и не может найти конструктор, который он мог бы использовать напрямую или разрешить его параметры.
Ответ 2
Я согласен с Wiktor.
Вы можете зарегистрировать конструктор без параметров Unity, хотя и остановите его, взяв более длинный параметр, выполнив следующее:
container.RegisterType<AccountController>(new InjectionConstructor());