【问题标题】:ServiceStack auto query global filterServiceStack 自动查询全局过滤器
【发布时间】:2016-04-19 08:06:22
【问题描述】:

我正在考虑使用 ServiceStack 的 AutoQuery 功能,并且我有一些基本的查询正在工作。但是我想实现一个全局过滤器,因为我有一个多租户数据库,例如,

所有查询都应附加条件 CustomerId = Session.CustomerId

最好的方法是什么?

【问题讨论】:

  • 这里不允许提出“最佳方式”问题。尝试阅读规则。

标签: c# servicestack ormlite-servicestack


【解决方案1】:

您可能会为此使用custom AutoQuery base class 将自定义过滤器附加到每个查询,例如:

public abstract class MyAutoQueryServiceBase : AutoQueryServiceBase
{
    public override object Exec<From>(IQuery<From> dto)
    {
        var q = AutoQuery.CreateQuery(dto, Request);
        var session = base.SessionAs<CustomUserSession>();
        q.And("CustomerId = {0}", session.CustomerId);

        return AutoQuery.Execute(dto, q);
    }

    public override object Exec<From, Into>(IQuery<From, Into> dto)
    {
        var q = AutoQuery.CreateQuery(dto, Request);
        var session = base.SessionAs<CustomUserSession>();
        q.And("CustomerId = {0}", session.CustomerId);

        return AutoQuery.Execute(dto, q);
    }
}

然后告诉 AutoQuery 使用您的基类,例如:

Plugins.Add(new AutoQueryFeature { 
    AutoQueryServiceBaseType = typeof(MyAutoQueryServiceBase)
});

【讨论】:

  • MyAutoQueryServiceBase 示例可以工作,但它不会提供编译时安全性。如果我想要一个不同的签名来强制执行 From 类型是某个特定的接口,例如接口 IMustHaveSomeCustomerId?类似公共对象 Exec(IQuery dto) where From : IMustHaveSomeCustomerId
  • 有没有办法只使用 AutoQuery.CreateQuery 生成 sql 表达式 但禁用 AutoQueryServiceBase?所以我必须手动为所有 IQuery 提供实现?这听起来可能很奇怪,但是如果没有提供编译时类型安全的能力,我不能盲目地按照答案中的建议执行 q.And("CustomerId = {})。
  • @Jeff 如果您想要一个能够使用接口的类型化 API,请查看 Query Filters
  • 是错误还是我做错了什么,在执行 .RegisterQueryFilter((req, q, dto) => 时,req 为 NULL。我正在使用 SS 4.0.50.
  • @Jeff Can't tell please open a new question with all the code you are using.
猜你喜欢
  • 2021-08-21
  • 2022-01-22
  • 2022-10-23
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多