在我看来,您正在抽象之上创建一个抽象,没有真正的目的,也没有真正的好处。我对 ASP.NET 提供程序的实现方式有疑问(为了可测试性),但我以另一种方式解决了这个问题。
我所做的是创建一个包装 MembershipProvider 并实现接口的类。它所做的只是将方法调用传递给 MembershipProvider,但它允许我依赖接口而不是实现。在我的测试中,我可以将 IMembershipProvider 换成模拟版本。
编辑,示例代码:
会员服务
// Membership service that just provides Create/Delete
public interface IMembershipService
{
IMembershipUser CreateUser(string username, string password);
void DeleteUser(string username);
}
和 IMembershipUser
// IMembershipUser that provides a lot of the necessary details
public interface IMembershipUser
{
string UserName { get; }
bool IsApproved { get; }
bool IsLockedOut { get; }
string Email { get; }
DateTime LastLoginDate { get; }
DateTime CreationDate { get; }
bool ChangePassword(string oldPassword, string newPassword);
string ResetPassword();
Guid UserID { get; }
}
和一个简单的 ASP.NET 提供程序包装器:
public class MembershipWrapper : IMembershipFactory
{
#region IMembership Members
public IMembershipUser CreateUser(string email, string password)
{
var user = System.Web.Security.Membership.CreateUser(email, password, email);
return new MembershipUserWrapper(user);
}
public void DeleteUser(string userName)
{
System.Web.Security.Membership.DeleteUser(userName);
}
#endregion
}
和会员用户
public class MembershipUserWrapper : IMembershipUser
{
private MembershipUser _User;
public MembershipUserWrapper(MembershipUser user)
{
_User = user;
}
#region IMembershipUser Members
public string ResetPassword()
{
return _User.ResetPassword();
}
public bool ChangePassword(string oldPassword, string newPassword)
{
return _User.ChangePassword(oldPassword, newPassword);
}
public string UserName
{
get { return _User.UserName; }
}
public bool IsApproved
{
get { return _User.IsApproved; }
}
public bool IsLockedOut
{
get { return _User.IsLockedOut; }
}
public string Email
{
get { return _User.Email; }
}
public DateTime LastLoginDate
{
get { return _User.LastLoginDate; }
}
public DateTime CreationDate
{
get { return _User.CreationDate; }
}
public Guid UserID
{
get { return (Guid)_User.ProviderUserKey; }
}
#endregion
}
非常简单的实现,但你可以带着它去城里。