动态地将IHasRequestFilter应用于插件注册服务

时间:2014-12-11 11:49:54

标签: servicestack

我有一组服务,我想在各种ServiceStack项目中使用(好吧,两个),所以我创建了一个注册它们的ServiceStack插件。

但是,我希望允许用户确定自己的安全访问方法。

目前,我的项目中有一个IHasRequestFilter,可以确定用户应该能够访问哪些服务。我不想在插件项目中引用它,所以我想在事后动态添加它。

我想以某种方式获取对AppHost中服务定义的引用,将此IHasRequestFilter添加到特定服务集的管道中。

理想情况下,我应该能够做到这样的事情:

new CustomPlugin(new CustomPluginParams {
  RestrictTo = CustomRestrictions,
  RequestFilters = [],
  ResponseFilters = []
});

这应该使用这些属性来配置其服务,而无需使用以前的类型化引用。

编辑:

进一步调查似乎IHasRequestFilter和IHasResponseFilters仅在ServiceExec<TService>类中解析一次。我可以通过使用代理创建我的服务来解决这个问题,该代理将我需要的属性添加到操作的MemberInfo中,但是我并不认为这是一种干净的方法。

有人有推荐吗?

1 个答案:

答案 0 :(得分:1)

在ServiceStack中,所有配置都应该在AppHost的Configure()方法中进行,之后保持不变。

生命周期事件

为了帮助LifeCycle事件,您的插件可以实现IPreInitPluginIPostInitPlugin Plugin Interfaces,以便在注册所有插件之前和之后回调它们。

在整个AppHost完成初始化之后,还有一个IAppHost.AfterInitCallbacks插件可以用来回叫。

Typed Request/Response Filters

属性通常在服务上静态定义,以动态添加适用于特定请求/响应的逻辑,您可以使用类型化的请求/响应过滤器。

ServiceStack过滤器的优点在于它们共享相同的API (IRequest, IResponse, object),这使得它们易于组合,例如:

RegisterTypedRequestFilter<CustomRequest>(new RequestAttributeFilter().Execute);

动态添加属性过滤器

由于所有ServiceStack库都使用ServiceStack.Text的Reflection API,因此您可以将ServiceStack基于属性的代码优先API dynamically by adding attributes扩展到类型或属性在运行时,例如:

typeof(CustomRequest)
    .AddAttributes(new RuntimeAttributeRequestFilter());

这可以在大多数ServiceStack的代码优先API公司中完成。请求/响应过滤器。

路由属性和操作过滤器

在调用AppHost的Configure()之前,服务路由属性和操作过滤器有时会出现预先配置和自动装配的问题。

一种解决方案是在AppHost构造函数中添加它们(或通过覆盖AppHost.OnBeforeInit),以便在配置服务之前添加它们。否则,您可以通过调用AppHost ServiceController.ResetServiceExecCachesIfNeeded()来重置操作过滤器缓存。