Как получить общие значения (IpAddress, TenantId) в GenericDao?

Мы используем Play! для сеансов HTTP.

tenantId и ipAddress являются столбцами, которые являются общими для нескольких таблиц.

Когда пользователь вошел в систему, мы сохраняем tenantId в HttpContextSession

Всякий раз, когда нам нужен ip-адрес пользователя, мы используем Http.Context.current().request().remoteAddress() для хранения ip-адреса.

У нас имеется огромный набор запросов, и теперь мы хотим сохранить или запросить общий путь для tenantId.

Все запросы передаются через GenericDao

Можно ли использовать GenericDao для получения идентификатора арендатора, чтобы мы могли добавлять все запросы?

Http.Context.session().get("tenantId");

Какой лучший способ сохранить или получить эти данные?

Спасибо.

Ответ 1

Вы не хотите, чтобы ваш DAO должен был зависеть от уровня представления, например, сеанса HTTP. Я бы рекомендовал абстракцию, чтобы скрыть эти подробности.

Создайте интерфейс TenantIdProvider и введите его в свой DAO. Он будет выглядеть примерно так:

public interface TenantIdProvider
{
    String getTenantId();
}

Затем создайте реализацию под названием HttpSessionTenantIdProvider.

class HttpSessionTenantIdProvider implements TenantIdProvider
{
    @Override
    public String getTenantId()
    {
        return Http.Context.session().get("tenantId");
    }
}

Теперь ваш GenericDAO может иметь ссылку на TenantIdProvider, и каждый запрос, который нуждается в tenantId, может получить его через TenantIdProvider и не иметь никакой зависимости от платформы воспроизведения или любого другого уровня представления, который вы используете.

Это действительно становится важным, если у вас есть запланированные задания, которые запускают и отправляют уведомления или какую-либо другую задачу, и они используют этот DAO. Если бы этот DAO зависел от сеанса HTTP, это было бы невозможно. Ваше приложение для работы может создать TenantIdProvider, который только что вернул "систему" ​​или что-то в этом роде.