0

DLLアーキテクチャ/デザインパターン/OOについてサポートが必要です。

私は現在の課題の解決策としてクラスファクトリデザインパターンについて学習しており、この時点でいくつかのフィードバックを使用できます。

ASP.NET 2.0のProfileProvider、MembershipProvider、およびRoleProviderのカスタムラッパーである3つのクラスがあります。

開発者にとって合理的にシンプルで直感的な、それぞれを呼び出す方法を実装したいと思います。効果のあるもの:

Object obj = new Users().Permissions.CreateRole();
Object obj = = new Users().Membership.CreateUser();
Object obj = = new Users().Profile.GetUserProfile();

抽象クラスファクトリを使用してこれを行う方法について私が読んだ例(実際、これが進むべき道である場合)は、やや混乱を招きます(私はこのリンクを回避するために取り組んできました)。

開始方法に関するベストプラクティスに関する提案はありますか?または、さらに良いことに、イラストをコード化しますか?:)

4

2 に答える 2

1

メンバーシップ プロバイダー クラスの API は非常に単純であり、それらをラップすることで得られるものはあまりないと思います。あなたが探しているのはファサードパターンだと思います。基本的に、アプリケーションのユーザー管理アクティビティをカプセル化し、内部実装を隠すクラスを作成します。クラスへの呼び出しは次のようになります。

userService.CreateAdminUser("keith", "godchaux");

UserService クラスは、メンバーシップ プロバイダーを使用して新しいユーザーを作成し、管理者の役割を割り当てます。

于 2010-01-15T17:42:09.740 に答える
0

本当の目的もなく、本当の利益もない抽象化の上に抽象化を作成しているように見えます。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
}

非常にシンプルな実装ですが、それで町に行くことができます。

于 2010-01-15T16:42:36.550 に答える