Asp.net mvc ASP.NET成员资格:自定义配置文件继承

Asp.net mvc ASP.NET成员资格:自定义配置文件继承,asp.net-mvc,asp.net-membership,membership-provider,Asp.net Mvc,Asp.net Membership,Membership Provider,我使用的是ASP.NET MVC4,我已经设置了一个自定义概要文件类,如本文所述 我还更新了web.config上配置文件定义的条目: <profile defaultProvider="DefaultProfileProvider" inherits="MembershipTestsV3.Models.CustomProfile"> <providers> <add name="DefaultProfileProvider" typ

我使用的是ASP.NET MVC4,我已经设置了一个自定义概要文件类,如本文所述

我还更新了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>
现在,我希望有许多类型的配置文件继承自这个基础;例如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;

我知道在数据库级别,概要文件只会将所有相关列保存在同一个表中,我只想在服务层上组织属性。有什么方法可以实现这一点吗?

在ProviderModel内部是不可能的,但如果在其周围构建一个层,就可以实现这一点。你可以走几条路:

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

整个会员计划似乎“关闭”。一方面,通用提供程序得到了极大的实现,但属性扩展起来很麻烦(因为它们以BLOB形式存储在一个具有通用结构的表上),另一方面,SimpleMembership允许对概要文件表使用CodeFirst,但与许多预先制作的管理工具(如SecurityGuard)不兼容。
public class SupervisorProfile : CustomProfile
{
    public string Department
    {
        get { return this["Department"] as string; }
        set { this["Department"] = value; }
    }
}
var customProfile = HttpContext.Profile as SupervisorProfile;