Dependency injection 自定义成员资格提供程序和Unity注入

Dependency injection 自定义成员资格提供程序和Unity注入,dependency-injection,unity-container,custom-membershipprovider,Dependency Injection,Unity Container,Custom Membershipprovider,我已经为我的MVC4解决方案创建了一个自定义成员资格提供程序。问题是我不能通过团结来注射 我曾尝试使用构造函数注入,但随后出现了无参数构造函数错误。如果我尝试使用InjectionProperty,它不会更改我的任何属性。我已尝试使用DependencyResolver.Current.GetService();它返回null 我首先通过web.config连接了提供程序: <membership defaultProvider="ExtendedServiceMembershipPr

我已经为我的MVC4解决方案创建了一个自定义成员资格提供程序。问题是我不能通过团结来注射

我曾尝试使用构造函数注入,但随后出现了无参数构造函数错误。如果我尝试使用InjectionProperty,它不会更改我的任何属性。我已尝试使用DependencyResolver.Current.GetService();它返回null

我首先通过web.config连接了提供程序:

  <membership defaultProvider="ExtendedServiceMembershipProvider" userIsOnlineTimeWindow="15">
  <providers>
    <clear />
    <add name="ExtendedServiceMembershipProvider" type="Foo.Providers.Security.BoxMembershipProvider, Foo" />
  </providers>
</membership>
<roleManager defaultProvider="ExtendedServiceRoleProvider">
  <providers>
    <clear />
    <add name="ExtendedServiceRoleProvider" type="Foo.Providers.Security.BoxRoleProvider, Foo" />
  </providers>
</roleManager>

这是正确的方法吗? 希望你们中的一些人能解决我的问题


谢谢。

您应该做的是创建一个空的成员资格提供程序,它只需调用MVC依赖项解析器来获取真正的
成员资格提供程序。通过这样做,您可以实现三件事:

  • 此实现有一个默认构造函数,可以在web.config中配置
  • 该实现是一个MVC基础设施组件,与包含该实现(您可能想要测试)的实际成员资格提供程序分离
  • 这个基础设施组件不依赖于Unity(或任何其他容器),而只依赖于MVC3,这降低了容器本身的耦合
实现可能如下所示:

public class DependencyResolverMembershipProvider : MembershipProvider
{
    private static MembershipProvider Provider
    {
        get
        {
            var provider = DependencyResolver.Current.GetService<MembershipProvider>();

            if (provider == null)
            {
                throw new InvalidOperationException(
                    "Make sure the MembershipProvider is registered.");
            }

            return provider;
        }
    }

    public override string ApplicationName
    {
        get { return Provider.ApplicationName; }
        set { Provider.ApplicationName = value; }
    }

    public override bool ChangePassword(string username, 
        string oldPassword, string newPassword)
    {
        return Provider.ChangePassword(username, oldPassword, newPassword);
    }

    public override bool ChangePasswordQuestionAndAnswer(string username, 
        string password, string newPasswordQuestion, string newPasswordAnswer)
    {
        return Provider.ChangePasswordQuestionAndAnswer(username,
            password, newPasswordQuestion, newPasswordAnswer);
    }

    public override MembershipUser CreateUser(string username, 
        string password, string email, string passwordQuestion, 
        string passwordAnswer, bool isApproved, object providerUserKey, 
        out MembershipCreateStatus status)
    {
        return Provider.CreateUser(username, password, email,
            passwordQuestion, passwordAnswer, isApproved, providerUserKey,
            out status);
    }

    // Implement all other methods here
}
公共类依赖项ResolverMembershipProvider:MembershipProvider
{
私有静态成员身份提供程序
{
得到
{
var provider=DependencyResolver.Current.GetService();
if(提供程序==null)
{
抛出新的InvalidOperationException(
“确保会员资格提供商已注册。”);
}
退货供应商;
}
}
公共重写字符串ApplicationName
{
获取{return Provider.ApplicationName;}
设置{Provider.ApplicationName=value;}
}
public override bool ChangePassword(字符串用户名,
字符串oldPassword,字符串newPassword)
{
返回Provider.ChangePassword(用户名、旧密码、新密码);
}
公共覆盖bool ChangePasswordQuestionAndAnswer(字符串用户名,
字符串密码、字符串newPasswordQuestion、字符串newPasswordAnswer)
{
返回提供程序.ChangePasswordQuestionAndAnswer(用户名,
密码、新密码问题、新密码答案);
}
公共覆盖成员身份用户CreateUser(字符串用户名,
字符串密码、字符串电子邮件、字符串密码问题、,
字符串passwordAnswer,bool已批准,对象提供程序UserKey,
out成员身份(创建状态)
{
返回Provider.CreateUser(用户名、密码、电子邮件、,
passwordQuestion、passwordAnswer、isApproved、providerUserKey、,
退出状态);
}
//在这里实现所有其他方法
}
这仍然是大量的工作,因为
MembershipProvider
有很多方法。有两种方法可以简化此过程:

  • 使用一个框架,例如,它已经为您做了这样的事情,并且以一种更愉快的方式来做,因为它分离了这些类中的职责,并公开了一些您可以为此功能实现的新接口
  • 防止系统的任何部分依赖于静态
    成员身份
    类,但始终将
    成员身份提供程序
    注入这些类,甚至更好:不要使用
    成员身份提供程序
    ,而只需注入该
    成员身份提供程序
    (例如
    IUserRepository
    IPasswordManager

谢谢,这对我来说更有意义。最后,我决定将自定义登录与已创建的MembershipService一起使用。