Пользовательское членство провайдера и внедрение зависимостей

Я нашел несколько вопросов, похожих на тот, который я публикую, но я не получаю от них то, что мне действительно нужно. Я все еще пытаюсь реализовать CustomMembershipProvider с помощью Microsoft Unity DI,

Пользовательское членство:

public class CustomMembershipProviderService : MembershipProvider
    {
        private readonly IUserService _userService;

        public CustomMembershipProviderService(IUserService userService)
        {
            this._userService = userService;
        }

        public override string ApplicationName
        {
        ...

Сервис пользователя:

public class UserService : IUserService
    {
        private readonly IUserRepository _repository;
        private readonly IUnitOfWork _unitOfWork;
        public UserService(IUserRepository repository, IUnitOfWork unitOfWork)
        {
            this._repository = repository;
            this._unitOfWork = unitOfWork;
        }
        ...

AccountController:

public class AccountController : Controller
{
     // next line is what I don't feel too sure about what to do?
     // shouldn't my controller constructor use an Interface as its property?

     private readonly CustomMembershipProviderService _customMembershipProviderService;

     public AccountController(CustomMembershipProviderService customMembershipProviderService)
     {
         this._customMembershipProviderService = customMembershipProviderService;
     }
     ...

Как я могу создать интерфейс для моего MembershipProvider учебный класс?

Я пробовал:

public interface ICustomMembershipProvider : MembershipProvider

но я не думаю, что это работает, поэтому я застрял и не знаю, как реализовать MembershipProvider используя мои репозитории, UoW, сервисы и Unity DI

1 ответ

Решение

Ответ на второй вопрос

Проблема с MembershipProvider а также RoleProvider в том, что они строятся не контейнером, а фреймворком. AFAIK единственный способ установить поставщика активного членства - это файл web.config. Итак, если вы хотите использовать контейнер для разрешения зависимостей, таких как репозитории, сервисы и т. Д. Через контейнер, вы должны использовать старый добрый (шучу) шаблон Service Locator.

public class CustomMebershipProvider : ICustomMebershipProvider  {
   public bool ValidateUser(string user, string pwd) {
     var svc = Global.Container.Resolve<IMyService>();
     /* ... */
   }
}

К первому вопросу

Вы все еще можете внедрить активный поставщик членства в контроллерах, используя Constructor Injection. Прежде всего, создайте интерфейс со всеми необходимыми вам методами. Проблема здесь в том, что MembershipProvider это конкретный класс, поэтому вы не можете наследовать интерфейс от него. Просто создайте свой новый интерфейс, копируя сигнатуры методов нужной вам функции MembershipProvider:

public interface ICustomMembershipProvider {
    bool MyMethod();


    /* From MembershipProvider */
    bool ValidateUser(string username,  string password);
    /* ... */
}

Затем позвольте вашему провайдеру реализовать это и ввести:

Container
  .RegisterType<ICustomMembershipProvider>(
     new InjectionFactory(c => (ICustomMembershipProvider) Membership.Provider))

Конечно, вам все равно нужно зарегистрировать своего провайдера пользовательского членства в web.config.