Как вы можете внедрить пользовательский членство asp.net mvc3, используя Autofac? - PullRequest
4 голосов
/ 21 февраля 2012

У меня есть приложение MVC3, использующее Autofac и пользовательский поставщик членства.

Если я пытаюсь внедрить провайдера, используя ctor, я получаю сообщение об ошибке: «Для этого объекта не определен конструктор без параметров».

public class MyMemberShipProvider : MembershipProvider
    {

        IUserRepository userRepository;

  public MyMemberShipProvider(IUserRepository userRepository)
        {
            this.userRepository = userRepository;

        }

Ответы [ 3 ]

8 голосов
/ 21 февраля 2012

Нельзя вводить во встроенных провайдеров (членство / роли). Вы можете использовать MVC 3 DependencyResolver с Autofac.

Быстрый пример ...

public override bool ValidateUser(string username, string password)
{
    var userRepo = DependencyResolver.Current.GetService<IUserRepository>();
    return userRepo.ValidateUser(username, password);
}
1 голос
/ 21 февраля 2012

Избегайте разрешения в коде приложения (проверьте пользователя и т. Д.), Так как это анти-паттерн поиска сервисов.Вы хотите разрешить только в своем «клеевом» коде / коде низкого уровня.

Это ниже для windsor, но реализация может быть легко отрегулирована.Вот один из изложенных для замка Виндзор, но реализация должна быть похожей.Это немного чище, поскольку это разрешается в вызове GetProvider - который здесь является «клейким» кодом, что позволяет избежать использования анти-паттерна локатора службы в реальных функциях членства (таких как ValidateUser)

http://bugsquash.blogspot.com/2010/11/windsor-managed-membershipproviders.html

0 голосов
/ 21 февраля 2012

Это потому, что вы также должны добавить свой репозиторий userRepository.Что-то вроде:

protected override void Load(ContainerBuilder builder)
{
    builder.RegisterType<UserRepository>().As<IUserReposotory>();
    builder.RegisterType<MyMembershipProvider>();
}
...