asp.net-mvc-3 – 自定义成员资格提供程序和统一依赖注入

前端之家收集整理的这篇文章主要介绍了asp.net-mvc-3 – 自定义成员资格提供程序和统一依赖注入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我发现了一些与我发布的问题类似的问题,但我并没有从他们那里得到我真正需要的东西.
我仍在努力使用Microsoft Unity DI来实现我的CustomMembershipProvider.

定制会员:

  1. public class CustomMembershipProviderService : MembershipProvider
  2. {
  3. private readonly IUserService _userService;
  4.  
  5. public CustomMembershipProviderService(IUserService userService)
  6. {
  7. this._userService = userService;
  8. }
  9.  
  10. public override string ApplicationName
  11. {
  12. ...

用户服务:

  1. public class UserService : IUserService
  2. {
  3. private readonly IUserRepository _repository;
  4. private readonly IUnitOfWork _unitOfWork;
  5. public UserService(IUserRepository repository,IUnitOfWork unitOfWork)
  6. {
  7. this._repository = repository;
  8. this._unitOfWork = unitOfWork;
  9. }
  10. ...

的AccountController:

  1. public class AccountController : Controller
  2. {
  3. // next line is what I don't feel too sure about what to do?
  4. // shouldn't my controller constructor use an Interface as its property?
  5.  
  6. private readonly CustomMembershipProviderService _customMembershipProviderService;
  7.  
  8. public AccountController(CustomMembershipProviderService customMembershipProviderService)
  9. {
  10. this._customMembershipProviderService = customMembershipProviderService;
  11. }
  12. ...

如何为MembershipProvider类创建接口?

我试过了:

  1. public interface ICustomMembershipProvider : MembershipProvider

但我觉得这不行,所以我卡住了,不知道如何使用我的存储库,UoW,服务和Unity DI实现MembershipProvider

解决方法

回答第二个问题

MembershipProvider和RoleProvider的问题在于它们不是由容器构建的,而是由框架构建的. AFAIK设置活动成员资格提供程序的唯一方法是web.config文件.
因此,如果您想通过容器使用容器来解析存储库,服务等依赖关系,那么您必须使用良好的旧(我开玩笑)服务定位器模式.

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

对第一个问题

您仍然可以使用Constructor Injection在控制器中注入活动成员资格提供程序.
首先,使用您需要的所有方法创建一个界面.这里的问题是MembershipProvider是一个具体的类,所以你不能从它继承接口.只需创建新界面,从MembershipProvider复制所需功能方法签名:

  1. public interface ICustomMembershipProvider {
  2. bool MyMethod();
  3.  
  4.  
  5. /* From MembershipProvider */
  6. bool ValidateUser(string username,string password);
  7. /* ... */
  8. }

然后让你的提供者实现它并注入:

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

当然,您仍然需要在web.config中注册自定义成员资格提供程序.

猜你在找的asp.Net相关文章