Custom MembershipProvider:没有为此对象定义的无参数构造函数

我有一个自定义MembershipProvider类,它inheritance自MembershipProvider,它带有两个参数:

public class CustomMembershipProvider : MembershipProvider { private readonly ISecurityRepository _securityRepository; private readonly IUserRepository _userRepository; public CustomMembershipProvider(ISecurityRepository securityRepository, IUserRepository userRepository) { ... } public override MembershipUser GetUser(string username, bool userIsOnline) { ... } ... etc } 

这个配置文件看起来类似于:

       

这在我的Web应用程序中主要用于登录和注销。 我正在使用Unity for DI并在我的Boostrapper.cs类中设置必要的类。

但是,当我想创建一个自定义User类并调用Membership.GetUser方法时,我最近遇到了一个问题。 当我这样做时,我得到以下exception:

 {"No parameterless constructor defined for this object. (C:\\*app path*\\web.config line 43)"} 

我的配置文件中的第43行指向我上面发布的自定义成员资格提供程序。 我认为在其他地方,应用程序使用Unity来解析这些参数,但在使用Membership类时却没有。

有什么办法可以告诉应用程序如何解决这些依赖关系,或者如果没有,有没有办法在不使用具体实现的情况下将这些依赖关系添加到我的成员资格提供程序?

编辑1:

这是自定义User类:

 public class User : MembershipUser { public int UserId { get; set; } public string Username { get; set; } public string Email { get; set; } public DateTime LastLoggedOnDate { get; set; } ... } 

编辑2:

在我的自定义成员资格提供程序类中,这是GetUser方法的样子:

 public override MembershipUser GetUser(string username, bool userIsOnline) { return _userRepository.GetUser(username); } 

问题是您无法通过构造函数注入Membership提供程序。 请参阅此问题

我使用Ninject实现了自定义成员资格提供程序,并使用ServiceLocator获取服务实例。

 public class AccountMembershipProvider : MembershipProvider { private readonly IUsers _users; public AccountMembershipProvider() { _users = ServiceLocator.Current.GetInstance(); } public override bool ValidateUser(string username, string password) { return _users.IsValidLogin(username, password); } ... } 

在您的情况下,您需要获取IUserRepository和ISecurityRepository。

连接接口/服务时

  private static void RegisterServices(IKernel kernel) { kernel.Bind().To(); kernel.Bind().To(); kernel.Bind().To().InRequestScope(); kernel.Bind().To().InRequestScope(); } 

你可以在这里查看一个完整的工作示例(使用Ninject,但你可以将它改编为Unity): https : //github.com/lopezbertoni/SampleApp

希望这可以帮助,

我也使用Unity并实现了自定义成员资格提供程序,但使用了稍微不同的方法。 检查代码示例:

 ///  /// Defines the custom membership provider class. ///  public class SsoMembershipProvider : MembershipProvider { private IApplicationsRepository _appsRepo; private IUsersRepository _usersRepo; private IMembershipsRepository _membershipsRepo; ///  /// Initializes a new instance of the  class /// using injectionConstructor attribute in order to get the repositories needed. ///  /// The apps repo. /// The users repo. /// The memberships repo. [InjectionConstructor] public SsoMembershipProvider(IApplicationsRepository appsRepo, IUsersRepository usersRepo, IMembershipsRepository membershipsRepo) { _appsRepo = appsRepo; _usersRepo = usersRepo; _membershipsRepo = membershipsRepo; } ///  /// Initializes a new instance of the  class. /// which calls the internal contructor. ///  /// This is happening due to the fact that membership provider needs a /// parametless constructor to be initialized public SsoMembershipProvider() : this(DependencyResolver.Current.GetService(), DependencyResolver.Current.GetService(), DependencyResolver.Current.GetService()) { } } 

这对我有用

 public ICustomerRepository CustomerRepository { get { return DependencyResolver.Current.GetService(); } } 

然后使用

 public override bool ValidateUser(string username, string password) { var abc = CustomerRepository.ValidateCustomer(username, password); }