3

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

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

我首先通过 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>

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

谢谢。

4

1 回答 1

3

您应该做的是创建一个空的成员资格提供程序,它只是调用 MVC Dependency Resolver 以获取真实的Membership Provider. 通过这样做,您可以实现三件事:

  • 此实现有一个默认构造函数,可以在 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类,但始终将 a 注入MembershipProvider到这些类中,甚至更好:不要使用 the ,MembershipProvider而只需注入可能在其后面的接口MembershipProvider(例如IUserRepositoryand IPasswordManager)。
于 2013-03-14T14:59:01.803 回答