Мне кажется, что вы создаете абстракцию поверх абстракции без реальной цели и без реальной выгоды.У меня есть проблемы с тем, как были реализованы поставщики ASP.NET (для тестируемости), но я обратился к этому по-другому.
Я создал класс, который обернул элемент MembershipProvider и реализовал интерфейс.Все, что он делает, это передает вызовы методов в MembershipProvider, но он позволяет мне полагаться на интерфейс, а не на реализацию.В моих тестах я могу поменять IMembershipProvider на поддельную версию.
edit, пример кода:
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
}
и MembershipUser
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
}
Очень простая реализация, но вы можете пойти в город с ней.