Пользовательское членство провайдера и внедрение зависимостей
Я нашел несколько вопросов, похожих на тот, который я публикую, но я не получаю от них то, что мне действительно нужно. Я все еще пытаюсь реализовать 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.