自定义会员提供程序和Unity注入

3

我为我的MVC4解决方案创建了一个自定义的成员资格提供程序。问题是我无法通过Unity注入它。

我尝试使用构造函数注入,但是然后我得到了参数列表构造函数错误。如果我尝试使用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>

这是正确的方法吗?希望你们中有人可以解决我的问题。

谢谢。

1个回答

3
你需要做的是创建一个空的成员资格提供程序,仅调用MVC Dependency Resolver来获取真正的“成员资格提供程序”。这样做可以实现以下三个目的:
  • 该实现具有默认构造函数并可以在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
}

这仍然是很多工作,因为MembershipProvider有许多方法。您可以通过以下两种方式使其更容易:

  • 使用像Griffin.MvcContrib这样的框架,它已经为您完成了这样的工作,并以更愉悦的方式分离了这些类中包含的职责并公开了一些新接口,您可以为此功能实现这些接口。
  • 防止系统的任何部分依赖于静态的Membership类,而总是将MembershipProvider注入到那些类中,甚至更好的做法是不使用MembershipProvider,而是直接注入可能在该MembershipProvider背后的接口(例如IUserRepositoryIPasswordManager)。

谢谢,我现在理解得更清楚了。最终我决定使用自定义登录,配合已创建的MembershipService。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接