如何在GenericDao中检索通用值(IpAddress,TenantId)?

我们正在使用游戏!用于 HTTP 会话的框架。

tenantId并且是跨多个表通用的列。ipAddress

当用户登录时,我们将tenantIdHttpContextSession

每当我们需要用户的IP地址时,我们都会使用该IP地址来存储IP地址。Http.Context.current().request().remoteAddress()

我们编写了大量的查询,现在我们希望以通用的方式保存或查询 。tenantId

所有查询都通过通用道进行

我们是否可以在 GenericDao 中使用以下内容来获取租户 ID,以便我们可以在所有查询中追加?

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 获取它,并且不依赖于 play 框架或您使用的任何其他表示层。

如果您最终拥有运行并发送通知或其他任务的计划作业,并且它们使用此DAO,这一点确实变得非常重要。如果此 DAO 依赖于 HTTP 会话,则不可能。你的作业应用可以创建一个租户 IdProvider,该提供程序仅返回“系统”或类似内容。


答案 2

推荐