如何在 GenericDao 中检索常用值(IpAddress、TenantId)?

Posted

技术标签:

【中文标题】如何在 GenericDao 中检索常用值(IpAddress、TenantId)?【英文标题】:How to retrieve common values (IpAddress, TenantId) in GenericDao? 【发布时间】:2017-01-21 04:00:25 【问题描述】:

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

tenantIdipAddress 是多个表中通用的列。

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

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

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

所有查询都通过 GenericDao

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

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

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

谢谢。

【问题讨论】:

50 rep 不会为您提供离题/过于宽泛/基于意见的答案,该答案很可能会在赏金到期后立即关闭并可能被删除。 您没有提供 Play Framework 的版本,1.x 和 2.x 明显不同。 2.x版本是当前正在使用的版本 【参考方案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,它刚刚返回“系统”或类似的东西。

【讨论】:

以上是关于如何在 GenericDao 中检索常用值(IpAddress、TenantId)?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QueryDSL 构建 GenericDao?

使用 group by / unique 进行 Genericdao 搜索

Hibernate GenericDAO 用于父/子关系和 DAO/DTO 模式

Hibernate genericDao 投影

如何使用 Google GenericDAO 中的 Seach 和 Filter 类来搜索未映射的类对象?

使用 GenericDAO 插入第二个数据源时出错