dependency-injection - 自定义成员(member)提供者和 Unity 注入(inject)

标签 dependency-injection unity-container custom-membershipprovider

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

我曾尝试使用构造函数注入(inject),但随后出现无参数构造函数错误。如果我尝试使用 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 依赖项解析器来获取真正的 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 ,它已经为您做了这样的事情,甚至以更愉快的方式做这件事,因为它分离了这些类内部的职责,并公开了一些您可以为此功能实现的新接口(interface)。
  • 防止系统的任何部分依赖于静态 Membership 类,但始终将 MembershipProvider 注入(inject)这些类或更好:不要使用 MembershipProvider 但简单地注入(inject)可能在该 MembershipProvider 后面的接口(interface)(例如 IUserRepositoryIPasswordManager)。

关于dependency-injection - 自定义成员(member)提供者和 Unity 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15410575/

相关文章:

java - 为什么 Dagger 注入(inject)具体类?

ios - Interface Builder 如何与私有(private) IBOutlet 交互?

java - 如何在 Android Studio 的 Java 库模块中使用 Dagger?

c# - Unity 记录静态方法 AOP 风格或无接口(interface)

c# - 如何使用 asp.net mvc 和 unity 在 application_beginrequest 访问统一容器?

c# - ASP.NET 4 自定义成员资格提供程序表

c# - 注册按钮没有反应

c# - NHibernate 无法确定 X 的类型

c# - 如何在 BaseController 中初始化 BaseModel

unity-container - Unity 中的 ResolvedParameter。有人可以解释什么时候使用它吗?