2013-11-16 2 views
21

В настоящее время я работаю над реализацией новой аутентификации ASP.NET MVC 5 в своем приложении. Однако при использовании Unity как мой IoC, я не могу использовать любую часть AccountController, потому что я дал ошибку:Как добавить аутентификацию MVC 5 в Unity IoC?

The type IUserStore`1 does not have an accessible constructor.

Это моя дается установка единство, которое называется в 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 
{ 

} 

Любая помощь будет широко оценена!

ответ

22

Поскольку у вас есть два конструктора на вашем контроллере, единство подберет тот, у которого есть более длинный список параметров, последний. Он требует, чтобы UserManager был введен.

Хотя вы не указали его здесь, я подозреваю, что у него есть только конструктор, который требует IUserStore. Unity попыталась разрешить его и не может найти конструктор, который он может использовать напрямую или разрешить его параметры.

+0

Спасибо за вашу помощь! Хотя hutchonoid имеет фактический синтаксис для регистрации, вы объяснили это, чтобы я мог понять, почему. –

+0

Чувак, если бы я мог проголосовать за это, как 20+ раз !!! Спасибо!! – Rogala

33

Я согласен с Wiktor.

Вы можете зарегистрировать конструктор без параметров с Unity, хотя и остановить его принимать более длинный параметр, делая это:

container.RegisterType<AccountController>(new InjectionConstructor()); 
+2

Спасибо за помощь! Именно это я и сделал. –

+1

Большое спасибо. Я отправился сюда (http://msdn.microsoft.com/en-us/library/microsoft.practices.unity.injectionconstructor.injectionconstructor(v=pandp.30).aspx), чтобы расширить свое понимание объекта InjectionConstructor. Если вы хотите сопоставить конструктор в AccountController с несколькими параметрами, вы можете передать их в виде массива объектов в InjectionConstructor. – Shawn

+0

@hutchonoid, когда я делаю то, что вы предложили, мой 'account/login' возвращает ошибку ** 404 **! Я на MVC5 с последней версией Unity. – Ciwan

Смежные вопросы