Что мне нравится делать в моих проектах, так это иметь отдельный SessionService
(вы можете называть его так, как вам нравится), который является областью обслуживания, где хранятся все пользовательские параметры и настраиваемая информация (например, его / ее уровень доступа, предпочитаемый язык, роль, культурные предпочтения, национальность, валюта и т. д. c.).
Для инициализации этой службы я использую фильтр действий, и это один из примеров этого. Чтобы узнать больше о фильтре в ASP. Net Core, вы можете обратиться к их документации .
public class SessionFilter : IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
if (context?.HttpContext == null) return;
var services = context.HttpContext.RequestServices;
var sessionProvider = services?.GetService<ISessionProvider>();
if (sessionProvider == null) return;
// Read the user identifier.
var userRepository = services.GetService<IUserRepository>();
Guid userId = default;
var claims = context.HttpContext.User?.Claims;
var idClaim = claims?.FirstOrDefault(c => c.Type == RequestData.ID_CLAIM)?.Value;
if (userRepository != null && Guid.TryParse(idClaim, out var id))
{
var getUserInfo = await userRepository.EnsureExistsAsync(id, context.HttpContext.RequestAborted).ConfigureAwait(false);
if (getUserInfo.Data && getUserInfo.Success)
userId = id;
}
// Read the preferred language.
var headers = context.HttpContext.Request?.Headers;
var preferredLanguage = string.Empty;
if (headers != null && headers.TryGetValue(RequestData.LANGUAGE_HEADER, out var preferredLanguageHeader))
preferredLanguage = preferredLanguageHeader.FirstOrDefault();
if (string.IsNullOrWhiteSpace(preferredLanguage)) preferredLanguage = UserConfigurationParameters.DEFAULT_LANGUAGE;
// Configure the current session.
sessionProvider.ConfigureSession(userId, preferredLanguage);
await next();
}
}
И это фактический SessionService (здесь он называется ISessionProvider) .
public class SessionProvider : ISessionProvider
{
public SessionProvider()
{
this.PreferredLanguage = string.Empty;
}
public bool AllowReconfiguration { get; private set; }
public bool IsConfigured { get; private set; }
public Guid UserId { get; private set; }
public string PreferredLanguage { get; private set; }
public void ConfigureSession(Guid userId, string preferredLanguage, bool allowReconfiguration = false)
{
if (this.AllowReconfiguration == false && this.IsConfigured) throw new InvalidOperationException(ErrorMessages.SessionCannotBeReconfigured);
this.UserId = userId;
this.PreferredLanguage = preferredLanguage;
this.IsConfigured = true;
this.AllowReconfiguration = allowReconfiguration;
}
}
Таким образом, вы можете передавать данные о пользователе на каждый слой в вашем приложении благодаря механизму внедрения зависимостей в ASP.