14

我们正在使用 Play!HTTP 会话框架。

tenantId并且ipAddress是跨多个表共有的列。

当用户登录时,我们正在tenantId存储HttpContextSession

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

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

所有查询都通过 GenericDao

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

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

保存或检索这些详细信息的最佳方法是什么?

谢谢。

4

1 回答 1

0

你不希望你的 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,它刚刚返回“系统”或类似的东西。

于 2017-09-12T14:55:24.853 回答