Есть ли способ для ClassLibrary простой способ получить значение сеанса? - PullRequest
1 голос
/ 08 мая 2019

У меня есть внешний проект ClassLibrary, которому нужно получить значение сеанса, установленное из HomeController в основном проекте. Есть ли простой способ сделать это?

Или есть альтернатива для переноса значения из HomeController во внешнюю библиотеку ClassLibrary?

Ответы [ 3 ]

2 голосов
/ 08 мая 2019

Вы можете использовать IHttpContextAccessor класс

Для других платформ и пользовательских компонентов, которым требуется доступ к HttpContext, рекомендуемый подход заключается в регистрации зависимости с помощью встроенногов контейнере для инъекций зависимости.Контейнер внедрения зависимостей предоставляет IHttpContextAccessor всем классам, которые объявляют его как конструктор зависимостей в своих конструкторах.

public void ConfigureServices(IServiceCollection services)
{
     services.AddMvc()
         .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
     services.AddHttpContextAccessor();
     services.AddTransient<IUserRepository, UserRepository>(); 
}

В следующем примере:

  • UserRepository объявляет свою зависимость от IHttpContextAccessor.
  • Зависимость предоставляется, когда внедрение зависимостей разрешает цепочку зависимостей и создает экземпляр UserRepository.

.

public class UserRepository : IUserRepository
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public UserRepository(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void LogCurrentUser()
    {
        var username = _httpContextAccessor.HttpContext.User.Identity.Name;
        service.LogAccessRequest(username);
    }
}

Не забудьтедобавить services.AddHttpContextAccessor();, чтобы заставить внедрение зависимости работать.

2 голосов
/ 08 мая 2019

Принцип единоличной ответственности диктует, что класс должен делать только одно.В то время как вы можете внедрить что-то вроде IHttpContextAccessor, что потребует от класса знания таких понятий, как HttpContext, Session, факта, что он в первую очередь используется в веб-среде и т. Д.

Правильный подход заключается в том, чтобы ввести или передать значения .Если классу необходимо конкретное значение из переменной сеанса, получите доступ к сеансу в контроллере, где эта логика фактически принадлежит, а затем передайте только значение из сеанса в ваш внешний класс.

0 голосов
/ 08 мая 2019

Если вы используете шаблон Abp, служба приложений Abp ApplicationService уже содержит свойство AbpSession, вы можете наследовать этот класс.

...