我有一组服务,我想在各种ServiceStack项目中使用(好吧,两个),所以我创建了一个注册它们的ServiceStack插件。
但是,我希望允许用户确定自己的安全访问方法。
目前,我的项目中有一个IHasRequestFilter,可以确定用户应该能够访问哪些服务。我不想在插件项目中引用它,所以我想在事后动态添加它。
我想以某种方式获取对AppHost中服务定义的引用,将此IHasRequestFilter添加到特定服务集的管道中。
理想情况下,我应该能够做到这样的事情:
new CustomPlugin(new CustomPluginParams {
RestrictTo = CustomRestrictions,
RequestFilters = [],
ResponseFilters = []
});
这应该使用这些属性来配置其服务,而无需使用以前的类型化引用。
编辑:
进一步调查似乎IHasRequestFilter和IHasResponseFilters仅在ServiceExec<TService>
类中解析一次。我可以通过使用代理创建我的服务来解决这个问题,该代理将我需要的属性添加到操作的MemberInfo中,但是我并不认为这是一种干净的方法。
有人有推荐吗?
答案 0 :(得分:1)
在ServiceStack中,所有配置都应该在AppHost的Configure()
方法中进行,之后保持不变。
为了帮助LifeCycle事件,您的插件可以实现IPreInitPlugin
和IPostInitPlugin
Plugin Interfaces,以便在注册所有插件之前和之后回调它们。
在整个AppHost完成初始化之后,还有一个IAppHost.AfterInitCallbacks
插件可以用来回叫。
属性通常在服务上静态定义,以动态添加适用于特定请求/响应的逻辑,您可以使用类型化的请求/响应过滤器。
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()
来重置操作过滤器缓存。