C# 自定义成员身份提供程序:未为此对象定义无参数构造函数

C# 自定义成员身份提供程序:未为此对象定义无参数构造函数,c#,asp.net-mvc,dependency-injection,asp.net-membership,unity-container,C#,Asp.net Mvc,Dependency Injection,Asp.net Membership,Unity Container,我有一个从MembershipProvider继承的自定义MembershipProvider类,该类接受两个参数: public class CustomMembershipProvider : MembershipProvider { private readonly ISecurityRepository _securityRepository; private readonly IUserRepository _userRepository; public Cu

我有一个从MembershipProvider继承的自定义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
}
此文件的配置文件类似于:

<membership defaultProvider="CustomMembershipProvider">
  <providers>
    <clear />
    <add name="CustomMembershipProvider" type="Library.Membership.CustomMembershipProvider" />
  </providers>
</membership>
我的配置文件中的第43行指向我在上面发布的自定义成员资格提供程序。我认为在其他地方,应用程序正在使用Unity来解析这些参数,但在使用Membership类时却没有

是否有任何方法可以告诉应用程序如何解决这些依赖关系?如果没有,是否有一种方法可以在不使用具体实现的情况下将这些依赖关系添加到我的成员资格提供程序中

编辑1:

以下是自定义用户类:

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

问题是不能通过构造函数注入成员资格提供程序。指

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

public class AccountMembershipProvider : MembershipProvider
{
    private readonly IUsers _users;

    public AccountMembershipProvider()
    {
        _users = ServiceLocator.Current.GetInstance<IUsers>();
    }

    public override bool ValidateUser(string username, string password)
    {
        return _users.IsValidLogin(username, password);
    }
...
}
公共类AccountMembershipProvider:MembershipProvider
{
私有只读用户(iu用户);;
public AccountMembershipProvider()
{
_users=ServiceLocator.Current.GetInstance();
}
公共覆盖bool ValidateUser(字符串用户名、字符串密码)
{
返回_users.IsValidLogin(用户名、密码);
}
...
}
在您的情况下,您需要获得IUserRepository和ISecurityRepository

当您连接接口/服务时

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IUsers>().To<UsersService>();
        kernel.Bind<IRoles>().To<RolesService>();

        kernel.Bind<MembershipProvider>().To<AccountMembershipProvider>().InRequestScope();
        kernel.Bind<RoleProvider>().To<AccountRoleProvider>().InRequestScope();

    }
私有静态无效注册服务(IKernel内核)
{
kernel.Bind().To();
kernel.Bind().To();
kernel.Bind().To


希望这能有所帮助,

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

/// <summary>
/// Defines the custom membership provider class.
/// </summary>
public class SsoMembershipProvider : MembershipProvider
{


    private IApplicationsRepository _appsRepo;
    private IUsersRepository _usersRepo;
    private IMembershipsRepository _membershipsRepo;



    /// <summary>
    /// Initializes a new instance of the <see cref="SsoMembershipProvider"/> class
    /// using injectionConstructor attribute in order to get the repositories needed.
    /// </summary>
    /// <param name="appsRepo">The apps repo.</param>
    /// <param name="usersRepo">The users repo.</param>
    /// <param name="membershipsRepo">The memberships repo.</param>
    [InjectionConstructor]
    public SsoMembershipProvider(IApplicationsRepository appsRepo, IUsersRepository usersRepo, IMembershipsRepository membershipsRepo)
    {
        _appsRepo = appsRepo;
        _usersRepo = usersRepo;
        _membershipsRepo = membershipsRepo;
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="SsoMembershipProvider"/> class.
    /// which calls the internal contructor.
    /// </summary>
    /// <remarks>This is happening due to the fact that membership provider needs a
    /// parametless constructor to be initialized</remarks>
    public SsoMembershipProvider()
        : this(DependencyResolver.Current.GetService<IApplicationsRepository>(),
        DependencyResolver.Current.GetService<IUsersRepository>(),
        DependencyResolver.Current.GetService<IMembershipsRepository>())
    { }


}
//
///定义自定义成员资格提供程序类。
/// 
公共类SsoMembershipProvider:MembershipProvider
{
专用IApplicationsRepository\u appsRepo;
私人IUsersRepository用户;
私人IMembershipResposition成员资格EPO;
/// 
///初始化类的新实例
///使用injectionConstructor属性以获取所需的存储库。
/// 
///应用程序回购。
///用户进行回购。
///会员资格回购协议。
[注入构造函数]
公共SSO成员资格提供程序(IApplicationsRepository appsRepo、IUsersRepository usersRepo、iMembershipRepository MembershipRepo)
{
_appsRepo=appsRepo;
_usersRepo=usersRepo;
_MembershipsePO=MembershipsePO;
}
/// 
///初始化类的新实例。
///它称为内部构造函数。
/// 
///这是因为会员资格提供商需要
///要初始化的无参数构造函数
公共SSO成员资格提供程序()
:此(DependencyResolver.Current.GetService(),
DependencyResolver.Current.GetService(),
DependencyResolver.Current.GetService())
{ }
}
这对我很有效

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

您尚未发布自定义用户类代码?这就是错误所在?不,错误在于它无法解析自定义成员资格提供程序类。用户类是一个具有属性(名称、电子邮件、用户ID等)的非常简单的用户模板你的GetUser方法中有什么代码?这就是抛出错误的地方?你在问题中声明
调用了Membership.GetUser方法。当我这样做时,我得到了以下异常:
由于无法解析类,它实际上从未到达该代码。但我将用该代码更新帖子。这很痛苦。。我这周就这么做了。我最终将DI容器传递到了自定义成员资格提供程序中。省去了很多麻烦。但是它很脏。再次强调,这会使您的IOC依赖于您的成员资格提供程序,这并不总是理想的,例如,如果您正在构建一个公共库。谢谢,这很有帮助
public ICustomerRepository CustomerRepository { 
 get { return DependencyResolver.Current.GetService<ICustomerRepository>(); } 
}
public override bool ValidateUser(string username, string password)
{
    var abc = CustomerRepository.ValidateCustomer(username, password);
}