ASP.NET成员身份:自定义配置文件继承

时间:2013-05-15 20:51:02

标签: asp.net-mvc asp.net-membership membership-provider

我正在使用ASP.NET MVC4,我已按照此article about universal membership providers

中的说明设置了自定义配置文件类
public class CustomProfile : ProfileBase
{
    public DateTime? Birthdate
    {
        get { return this["Birthdate"] as DateTime?; }
        set { this["Birthdate"] = value; }
    }

    public static CustomProfile GetUserProfile(string username)
    {
        return Create(username) as CustomProfile;
    }

    public static CustomProfile GetUserProfile()
    {
        var user = Membership.GetUser();
        if (user == null) 
            return null;

        return Create(user.UserName) as CustomProfile;
    }
}

我还在web.config上更新了配置文件定义的条目:

<profile defaultProvider="DefaultProfileProvider" inherits="MembershipTestsV3.Models.CustomProfile">
  <providers>
    <add name="DefaultProfileProvider" 
         type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
         connectionStringName="DefaultConnection" 
         applicationName="MyAppName" />
  </providers>
</profile>

这意味着我可以随时实例化我的自定义配置文件对象:

var customProfile = HttpContext.Profile as CustomProfile;

现在,我希望从这个基础继承许多类型的配置文件;例如AdminUserProfile或SupervisorProfile:

public class SupervisorProfile : CustomProfile
{
    public string Department
    {
        get { return this["Department"] as string; }
        set { this["Department"] = value; }
    }
}

但是,每次我尝试转换对象时,我都会得到一个空引用异常:

var customProfile = HttpContext.Profile as SupervisorProfile;

我知道在数据库级别,配置文件只会将所有相关列保存在同一个表中,我只想在服务层上组织属性。有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:3)

在ProviderModel中是不可能的,但如果围绕它构建一个层,就可以实现它。你可以采取多种方式:

  • 将相关信息保存在另一个表中,并在配置文件中保存对该信息的引用。然后,您可以保留一个简单的配置文件类,并使用存储库或其他相关类来获取额外信息(可以是具有子类型的基本类型)。这将有利于对象组合而不是继承。
  • 保留一个包含所有属性的简单profile-class。不是直接从HttpContext获取配置文件,而是可以在它周围构建一个图层(如果你愿意的话,工厂),它会检查实例并返回不同的类型,具体取决于配置文件中的值