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

 张馨桐等你2502895757 发布于 2023-02-06 18:54

我有一个自定义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
}

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


  
    
    
  

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

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

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

lopezbertoni.. 6

问题是您无法通过构造函数注入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

希望这可以帮助,

1 个回答
  • 问题是您无法通过构造函数注入Membership提供程序.请参阅此问题

    我使用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);
        }
    ...
    }
    

    在您的情况下,您需要获取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();
    
        }
    

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

    希望这可以帮助,

    2023-02-06 18:59 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有