自定义的MembershipProvider:此对象定义无参数的构造函数 [英] Custom MembershipProvider: No parameterless constructor defined for this object

查看:227
本文介绍了自定义的MembershipProvider:此对象定义无参数的构造函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有从的MembershipProvider采用两个参数继承的自定义的MembershipProvider类:

 公共类CustomMembershipProvider:的MembershipProvider
{
    私人只读ISecurityRepository _securityRepository;
    私人只读IUserRepository _userRepository;    公共CustomMembershipProvider(ISecurityRepository securityRepository,IUserRepository userRepository)
    {
        ...
    }    公众覆盖的MembershipUser的getUser(用户名字符串,布尔userIsOnline)
    {
        ...
    }    ...等
}

此配置文件类似于这样:

 <会员defaultProvider =CustomMembershipProvider>
  <供应商>
    <清/>
    <添加名称=CustomMembershipProviderTYPE =Library.Membership.CustomMembershipProvider/>
  < /供应商>
< /会员>

这在我的web应用程序工作正常,主要是用于登录和注销。我使用统一的DI和在我的Boostrapper.cs类必需的类设置。

不过,我最近碰到一个问题,当我想创建一个自定义的用户类,并叫<一个href=\"http://msdn.microsoft.com/en-us/library/system.web.security.membership.getuser%28v=vs.110%29.aspx\"相对=nofollow称号=Membership.GetUser> Membership.GetUser 方法。我得到以下异常时,我做的:

  {这个对象定义无参数的构造函数(C:\\\\ *应用程序路径* \\\\ web.config中第43行)。}

在我的配置文件指向我上面张贴的定义成员资格提供线43。我认为其他地方的应用程序是使用Unity解决这些参数,但使用Membership类它没有时。

有什么办法,我可以告诉应用程序如何解决这些依赖关系或如果没有,就会有添加这些依赖关系到我的会员供应商不使用的具体实施的办法?

编辑1:

下面是自定义用户等级:

 公共类用户:的MembershipUser
{
    公众诠释用户ID {搞定;组; }
    公共字符串用户名{获得;组; }
    公共字符串电子邮件{获得;组; }
    公众的DateTime LastLoggedOnDate {搞定;组; }
    ...
}

编辑2:

在我的自定义成员提供一流的,这是的getUser方法是什么样子:

 公众覆盖的MembershipUser的getUser(用户名字符串,布尔userIsOnline)
{
    返回_userRepository.GetUser(用户名);
}


解决方案

现在的问题是,你不能注入通过构造函数中的成员资格提供程序。请参照<一个href=\"http://stackoverflow.com/questions/2753424/dependency-injection-with-custom-membership-provider\">this问题

我实现了使用Ninject自定义成员资格提供程序,我用的服务定位,以获得服务的实例。

 公共类AccountMembershipProvider:的MembershipProvider
{
    私人只读IUsers _users;    公共AccountMembershipProvider()
    {
        _users = ServiceLocator.Current.GetInstance&LT; IUsers&GT;();
    }    公众覆盖布尔的ValidateUser(用户名字符串,字符串密码)
    {
        返回_users.IsValidLogin(用户名,密码);
    }
...
}

在你的情况,你需要得到IUserRepository和ISecurityRepository。

在你的连线接口/服务

 私有静态无效RegisterServices(内核的iKernel)
    {
        kernel.Bind&所述; IUsers方式&gt;()到&lt; UsersService&GT;();
        kernel.Bind&所述; IRoles方式&gt;()到&lt; RolesService&GT;();        kernel.Bind&所述;的MembershipProvider方式&gt;()到&lt; AccountMembershipProvider方式&gt;()InRequestScope();
        kernel.Bind&所述; RoleProvider方式&gt;()到&lt; AccountRoleProvider方式&gt;()InRequestScope();    }

您可以检查它的一个完整的示例工作(使用Ninject,但你可以使其适应统一)在这里:的https: //github.com/lopezbertoni/SampleApp

希望这有助于

I have a custom MembershipProvider class that inherits from MembershipProvider that takes two parameters:

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
}

The config file for this looks similar to this:

<membership defaultProvider="CustomMembershipProvider">
  <providers>
    <clear />
    <add name="CustomMembershipProvider" type="Library.Membership.CustomMembershipProvider" />
  </providers>
</membership>

This works fine mostly throughout my web application for logging in and logging out. I am using Unity for DI and have the necessary classes setup in my Boostrapper.cs class.

However I recently ran into an issue when I wanted to create a custom User class and called the Membership.GetUser method. I get the following exception when I do:

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

Line 43 in my config file points to the custom membership provider that I posted above. I think that elsewhere the app is using Unity to resolve those parameters but when using the Membership class it doesn't.

Is there any way I can tell the application how to resolve those dependencies or if not is there a way of adding those dependencies to my membership provider without using the concrete implementation?

EDIT 1:

Here is the custom User class:

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

EDIT 2:

In my custom membership provider class this is what the GetUser method looks like:

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

解决方案

The problem is that you can't inject into the Membership provider via constructor. Refer to this question

I implemented a Custom Membership Provider using Ninject and I used the ServiceLocator to get the instance of the service.

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

In your case, you need to get the IUserRepository and ISecurityRepository.

When you wire your Interfaces/services

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

    }

You can check a complete example of it working (using Ninject but you can adapt it to Unity) here: https://github.com/lopezbertoni/SampleApp

Hope this helps,

这篇关于自定义的MembershipProvider:此对象定义无参数的构造函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆