8

我发现了一些与我发布的问题类似的问题,但我没有从他们那里得到我真正需要的东西。我仍在努力实现我的CustomMembershipProviderusing 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;
        }
        ...

帐户控制器:

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来实现

4

1 回答 1

8

回答第二个问题

MembershipProviderand的问题RoleProvider在于它们不是由容器构建的,而是由框架构建的。AFAIK 设置活动成员资格提供程序的唯一方法是 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 中注册您的自定义成员资格提供程序。

于 2013-05-20T06:32:36.223 回答