我已经为我的 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)(例如IUserRepository
和IPasswordManager
)。
关于dependency-injection - 自定义成员(member)提供者和 Unity 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15410575/