尝试在 PCL 服务模型项目中使用 ServiceStack RequiredPermission 属性

Trying to use ServiceStack RequiredPermission attribute in PCL service model project

我正在尝试将我们现有的 ServiceStack DTO 服务模型项目移植到可移植 Class 库,并发现 RequiredPermission 和 RequiresAnyPermission ServiceStack 属性似乎没有在 PCL 来自 nuget 的库。

我在 HelloMobile 示例项目 (https://github.com/ServiceStackApps/HelloMobile/tree/master/src/ServiceModel) 中找不到对这些属性的任何引用,其最近的提交评论暗示应该可以在 [=26] 中的客户端和服务器之间共享服务 DTO 定义=] 服务模型项目.

这是我packages.config的内容:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="ServiceStack.Client" version="4.0.52" targetFramework="portable45-net45+win8" />
  <package id="ServiceStack.Interfaces" version="4.0.52" targetFramework="portable45-net45+win8" />
  <package id="ServiceStack.Interfaces.Pcl" version="4.0.24" targetFramework="portable45-net45+win8" />
  <package id="ServiceStack.Text" version="4.0.52" targetFramework="portable45-net45+win8" />
</packages>

我必须添加 ServiceStack.Interfaces.Pcl 包才能获得我们也广泛使用的 IReturn<> 属性。

关于是否以及在何处可以为 PCL 项目定义这些属性有什么想法吗?

Filter Attributes[RequiredPermission][RequiredAnyPermission] 包含客户端上不存在的服务器行为。

由于它们是内部实现细节而不是关于您服务的元数据,因此强烈建议避免在 DTO 上完全注释它们,而是将它们添加到 "Service-level" 处的服务实现中,这将适用于所有服务:

[RequiredPermission("ThePermission")]
public class MyProtectedServices : Service
{
}

或者在 "Action-level" 如果您只想将其应用于单个服务,例如:

public class MyProtectedServices : Service
{
    [RequiredPermission("ThePermission")]
    public object Any(ProtectedRequest request)
    {
        ...
    }
}

另一种解决方案是使用 C# Add ServiceStack Reference 功能,它提供了另一种方法来在客户端项目中获取您的服务类型 DTO,并去除任何特定于服务器的属性。

DTO 应该只依赖于 ServiceStack.Interfaces

是将所有 DTO 包含在一个单独的 ServiceModel 项目中,该项目 唯一的依赖项 是 PCL ServiceStack.Interfaces.dll 因此每个 .NET 客户端都可以重复使用它们。