Ответ 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, который только что вернул "систему" или что-то в этом роде.