Custom Membership Provider和Unity依赖注入

8

我发现了几个与我发布的问题类似的问题,但是它们没能给我提供我真正需要的答案。我仍在努力使用Microsoft Unity DI实现我的CustomMembershipProvider。

自定义成员资格:

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;
        }
        ...

账户控制器:

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

但我认为这并不起作用,所以我陷入了困境,不知道如何使用我的存储库、UoW、服务和Unity DI来实现MembershipProvider

1个回答

8

回答第二个问题

MembershipProviderRoleProvider的问题在于它们不是由容器构建,而是由框架构建。据我所知,设置活动成员提供程序的唯一方法是通过web.config文件。 因此,如果您想通过容器解决依赖关系(例如存储库、服务等),则必须使用老式(开玩笑的)服务定位器模式。

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

关于第一个问题

您仍然可以使用构造函数注入将活动会员提供程序注入控制器。 首先,创建一个包含您需要的所有方法的接口。问题在于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中注册您的自定义成员提供程序。

那么根据您的回应,我的 AccountController 将在构造函数中将 ICustomMembershipProvider 作为参数传入? - SOfanatic
抱歉,还有一个问题,我的CustomMembershipProvider是否可以有一个包含IService的构造函数?或者我必须在每个方法中使用Global.Container.Resolve<IMyService>()?除了服务定位器模式之外,是否有其他方法? - SOfanatic
据我所知,您无法这样做,因为CustomMembershipProvider不是由容器创建的,而是在应用程序启动时由ASP.NET框架创建的。 - onof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接