Я бы очень признателен за некоторые советы, чтобы помочь мне с кэшированием объектов. Вот мои потребности: я хочу фильтровать некоторые действия моих контроллеров в соответствии с ролями пользователей, хранящимися в базе данных SQL.MVC.Net - Кэширование пользовательского объекта для предоставления данных для приложения (запросить подведение итогов)
Что я сейчас делаю: когда выполняется первый запрос текущего пользователя, я генерирую объект с некоторыми свойствами, инициализированными SQL-запросами. Я храню этот объект в сеансе с помощью настраиваемого поставщика, и я использую собственный поставщик роли для обработки тегов фильтров авторизации. Если сессия истекает пользователь regenarated .. Это что-то вроде этого (упрощенно):
класса пользователя
Public class User
public property Login as string
public property IsAdmin as boolean
public sub Init(byval pLogin as string)
Login = pLogin
//Do some logic on database to provides roles....
IsAdmin = dbReturnIsAdmin
end sub
public readonly property RolesList as string()
Get
Return New String() {If(IsAdmin, "UserIsAdmin", "")}
End get
end property
End class
поставщика пользовательского сеанса
Public Class SessionProvider
Private Const SESSION_USER As String = "SESSION_USER"
Public Shared Sub ReloadUser()
//'This instruction initiate user and load roles into an User class type object
HttpContext.Current.Session(SESSION_USER) = StructureService.GetInitializedUser(My.User.Name, UowProvider.StructureUow)
End Sub
Public Shared ReadOnly Property User() As Application.User
Get
//'If user doesn't exist so we create an user
If HttpContext.Current.Session(SESSION_USER) Is Nothing Then ReloadUser()
//'Return user
Return CType(HttpContext.Current.Session(SESSION_USER), Application.User)
End Get
End Property
End Class
поставщика Пользовательских ролей
Public Class AuthentifiedRoleProvider
Inherits RoleProvider
//Implement base role provider....
Public Overrides Function GetRolesForUser(username As String) As String()
return SessionProvider.User.RolesList
End Function
End Class
Реализация - WebConfig
<system.web> .....
<roleManager cacheRolesInCookie="false" defaultProvider="DefaultRoleProvider" enabled="true">
<providers>
<clear />
<add name="DefaultRoleProvider" type="AuthentifiedRoleProvider" />
</providers>
</roleManager>
</system.web>
Реализация - Контроллер
<Authorize(Roles:="UserIsAdmin")>
Public Function List_Items() As ActionResult
Return View()
End Function
Он работает ...
Но, я интересно, если это действительно хороший способ для достижения этой цели , Поскольку у меня есть карта сайта в моем приложении, которая ссылается на действия контроллеров, пользователь sessionprovider (и http-сеанс кстати) запрашивается 4 или 5 раз каждую загрузку меню.
Итак, мои вопросы:
- хранящий в сессию принесет проблемы с производительностью?
- Есть ли лучший способ сохранить мой пользовательский объект в виде кеша (-> я думаю о system.runtime.cache).
- В любом случае, как вы думаете, эта реализация хороша для достижения моих целей?
Большое спасибо!
Согласно комментарию MSDN я падаю в втором случае схема базы данных ролевого хозяйствования не является стандартным и я не могу изменить это по нескольким причинам. В любом случае я был убежден, что хранение сеанса не является правильным подходом к хранению пользовательских данных. Поскольку данные не должны использоваться совместно с пользователями, я буду рассматривать объект или память. Спасибо за Ваш ответ –