本当の目的もなく、本当の利益もない抽象化の上に抽象化を作成しているように見えます。ASP.NET プロバイダーの実装方法 (テスト容易性のため) に問題がありますが、別の方法で対処しました。
私がしたことは、MembershipProvider をラップしてインターフェイスを実装するクラスを作成することでした。メソッド呼び出しを MembershipProvider に渡すだけですが、実装ではなくインターフェイスに依存することができます。私のテストでは、IMembershipProvider をモック バージョンに置き換えることができます。
編集、サンプルコード:
IMembershipService
// 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
}
非常にシンプルな実装ですが、それで町に行くことができます。