你需要做的是创建一个空的成员资格提供程序,仅调用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);
}
}
这仍然是很多工作,因为MembershipProvider
有许多方法。您可以通过以下两种方式使其更容易:
- 使用像Griffin.MvcContrib这样的框架,它已经为您完成了这样的工作,并以更愉悦的方式分离了这些类中包含的职责并公开了一些新接口,您可以为此功能实现这些接口。
- 防止系统的任何部分依赖于静态的
Membership
类,而总是将MembershipProvider
注入到那些类中,甚至更好的做法是不使用MembershipProvider
,而是直接注入可能在该MembershipProvider
背后的接口(例如IUserRepository
和IPasswordManager
)。