2013-05-15 2 views
3

Я использую ASP.NET MVC4, я установки пользовательский класс профилей, как описано в этом article about universal membership providersASP.NET Membership: Настраиваемый профиль Наследование

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; 

Я знаю, что на уровне базы данных профиль будет просто сохранить все связанные столбцы в одной таблице, я просто хочу, чтобы свойства были организованы на уровне сервиса. Есть ли способ достичь этого?

ответ

3

Внутри ProviderModel это невозможно, но вы можете достичь этого, если вы создадите вокруг него слой. Вы можете использовать несколько способов:

  • Сохраните связанную информацию в другой таблице и сохраните ссылку на эту информацию внутри профиля. Затем вы можете просто сохранить простой класс профиля и использовать репозиторий или другой связанный класс, чтобы получить дополнительную информацию (которая может быть базовым типом с подтипами). Это будет способствовать составлению объектов над наследованием.
  • Сохраните простой класс профиля, который обладает всеми свойствами. Вместо того, чтобы получать профиль непосредственно из HttpContext, вы можете создать вокруг него слой (фабрика, если хотите), который проверяет экземпляр и возвращает другой тип, в зависимости от значений внутри профиля
+0

Вся схема членства кажется «выключено». С одной стороны, есть универсальные провайдеры, которые в значительной степени реализованы, но свойства - это сложность для расширения (поскольку они хранятся как капли на одной таблице с общей структурой), а с другой стороны есть SimpleMembership, которая позволяет CodeFirst для таблицы профилей, но несовместим со многими готовыми средствами администрирования, такими как SecurityGuard. – amhed

Смежные вопросы