如何包装MembershipUser

时间:2010-01-21 11:26:58

标签: asp.net

我如何包装MembershipUser以便下面的调用返回。包装的原因是我希望返回结果是一个可以模拟用户的接口。

public IMembershipUser GetUser(string username, bool userIsOnline)        
        {
            var user = Membership.GetUser(username, userIsOnline));

            //Do something 
            return WrappedUser;
        }

由于

3 个答案:

答案 0 :(得分:0)

我担心你不能这样做...

System.Web.Security.MembershipUser类型不会从任何特殊基类型继承,也不会被声明为部分,所以你无法做到这一点

但如果您让我们知道您想要做什么,我们可以提出替代解决方案。

答案 1 :(得分:0)

您可以通过实施自己的SiteMembershipProvider来实现这一目标。这是我之前做过的一个实现的示例片段:

public class CustomMembershipUser : MembershipUser
{
    public UserItem UserItem { get; private set; }

    public CustomMembershipUser(string providerName, UserItem user)
        : base(providerName, user.UserName, "user_" + user.UserID, user.Email,
            null, null, true, !user.IsCurrent, DateTime.MinValue, 
            DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue)
    {
        this.UserItem = user;
    }
}

public class SiteMembershipProvider : MembershipProvider
{
    ....

    private static MembershipUser GetMembershipUser(UserItem user)
    {
        return new CustomMembershipUser(_membershipProviderName,user);
    }

    public override MembershipUser GetUser(string username, bool userIsOnline)
    {
        // Load user
        return GetMembershipUser(foundUser);
    }

    ....
}

在Web.Config中:

    <membership defaultProvider="SiteMembershipProvider">
        <providers>
            <clear/>
            <add name="SiteMembershipProvider" type="SiteMembershipProvider" enablePasswordRetrieval="false" enablePasswordReset="false" requiresQuestionAndAnswer="false" connectionStringName="myConnectionString"/>
        </providers>
    </membership>

这应该默认您的整个网站使用名为MembershipProvider的新SiteMembershipProvider

a look herehere for an example来实现整个班级。

答案 2 :(得分:0)

您可以创建一个实现IMemberShipUser接口的类,并在内部存储对“真正的”MembershipUser的引用。

然后,包装类的属性和方法可以简单地委托给真正的引用。

编辑 - 下面的一个简单示例:

using System.Web.Security;
namespace Example
{
    public interface IMembershipUser
    {
        string UserName { get; }    
        string Email { get; }    
    }

    public class WrappedMembershipUser: IMembershipUser
    {
        private readonly MembershipUser realUser;

        public WrappedMembershipUser(MembershipUser realUser)
        {
            this.realUser = realUser;
        }
        public string UserName
        {
            get { return realUser.UserName; }
        }
        public string Email
        {
            get { return realUser.Email; }
        }
    }
}