如何将自定义 ServiceStack RequestFilterAttribute 应用于自动生成的服务?

How do I apply a custom ServiceStack RequestFilterAttribute to an auto-generated Service?

我有一个要应用于我的 ServiceStack 服务的自定义 RequestFilterAttribute:

[MyCustomAttribute]
public class MyService : ServiceStack.Service {...

我最近开始使用 AutoQuery 功能(这很棒),但我想知道如何将 MyCustomAttribute 应用到您 "get for free" 当您的请求 DTO 从 QueryBase 继承时自动生成的服务。

我当然可以使用 "magic" AutoQuery 代码向我的服务添加方法:

SqlExpression<DTO> sqlExpression = AutoQuery.CreateQuery(request, Request.GetRequestParams());

QueryResponse<DTO> response = AutoQuery.Execute(request, sqlExpression);

但我希望有更好的方法?

如果您想自定义 AutoQuery 行为,您应该首先查看 extensibility options using Query Filters 提供的内容。

否则,您应该能够将 RequestFilter 属性添加到请求 DTO 本身,即:

[MyCustomAttribute]
public class MyQuery : QueryBase<Poco> {}

或者,您可以使用以下方式获取对自动生成的服务的引用:

var autoQueryService = appHost.Metadata.GetServiceTypeByRequest(typeof(MyQuery));

然后使用动态API为其添加自定义属性,例如:

autoQueryService
    .AddAttributes(new MyCustomAttribute { ... });

由于服务仅在执行 AutoQueryFeature 插件后生成和注册,您只能在加载所有插件后才能访问该服务,您可以这样做:

1) In your own plugin 通过实施 IPostInitPlugin 接口

2) 通过注册一个 AfterInitCallbacks 处理程序:

this.AfterInitCallbacks.Add(appHost => { ... });

3) 通过重写 AppHost 中的 OnAfterInit() 虚拟方法,例如:

public override void OnAfterInit()
{
    ...
    base.OnAfterInit();
}