0

我需要一些有关 DLL 架构/设计模式/OO 的帮助。

我一直在学习类工厂设计模式作为我当前挑战的解决方案,并且在这一点上可以使用一些反馈。

我有三个类,它们是 ASP.NET 2.0 的 ProfileProvider、MembershipProvider 和 RoleProvider 的自定义包装器。

我想实现一种对开发人员来说相当简单和直观的调用方式。大意是:

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

我读过的关于如何使用抽象类工厂来做到这一点的例子(如果,确实,这是要走的路)有些令人困惑(我一直在努力解决这个链接)。

关于如何开始的最佳实践有什么建议吗?或者,更好的是代码插图?:)

4

2 回答 2

1

The APIs for the membership provider classes are pretty straightforward and I don't think there's much to be gained by wrapping them. I think what you're looking for is the facade pattern. Basically you would create a class that encapsulates the user management activities for your application and hides the internal implementation. Calls to the class might look like:

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

the UserService class would use the membership provider to create a new user and assign the admin role to them.

于 2010-01-15T17:42:09.740 回答
0

在我看来,您正在抽象之上创建一个抽象,没有真正的目的,也没有真正的好处。我对 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
}

非常简单的实现,但你可以带着它去城里。

于 2010-01-15T16:42:36.550 回答