Servicestack - 将服务组合在一起

时间:2014-01-31 17:03:14

标签: servicestack

想知道是否有一种推荐的最佳实践方法,即将类似服务组合在一起,成为一个越来越大的项目。假设我的大多数服务都可以用于处理“专业”数据或“业余”数据(数据超出表中的简单标志,数据本身完全不同,来自不同的表,在专业或业余方。

我知道我可以为我的班级添加路线......

/亲/服务1 / AM /服务2

看起来我可以将DTO放在命名空间中....

Service.Interface项(服务和工厂类)怎么样?你会把它们放入命名空间吗?

最后,元数据页面是否有办法反映这些分组?我开始走这条路,但所有服务都按字母顺序列出,你看不到service1和service2之间的路由或命名空间差异。

谢谢

2 个答案:

答案 0 :(得分:2)

组织您的大型项目:

对于复杂的服务,我在一个解决方案中设置了4个项目。

  • AppHost,负责服务的配置。 (参考模型,服务和类型)
  • 模型,这是数据库模型(不引用其他项目)
  • 服务,这只是服务的实现,而不是接口或DTO (参考模型和类型)
  • 类型,包括我的界面,DTO和路线。 (不参考其他项目)

拥有单独的Types库允许分发给客户端,例如与ServiceStack JsonServiceClient一起使用。

是的,您可以以任何方式命名接口,DTO和工厂类。只要在您的服务中正确引用它们,它们就会起作用。

如果您尝试分离多个服务,则应考虑将服务代码分离到服务项目中的逻辑文件夹中。即。

  • /服务/临
  • /服务/业余

使用适当的名称将服务方法的外部代码包装在public partial static class MyServiceStackApplication中。然后将其引用为AppHost构造函数中的程序集。例如:

专业服务(Service Project/Pro/UserActions.cs

public partial static class MyServiceStackApplication
{
    public partial class Pro
    {
        public class UserActionsService : Service
        {
             public User Get(GetUserRequest request)
             {
             }
        }

        // ...
    }
}

专业服务(Service Project/Pro/OtherActions.cs

public partial static class MyServiceStackApplication
{
    public partial class Pro
    {
        public class OtherActionsService : Service
        {
             public Other Get(GetOtherRequest request)
             {
             }
        }

        // ...
    }
}

业余服务(Service Project/Am/UserActions.cs

public partial static class MyServiceStackApplication
{
    public partial class Amateur
    {
        public class UserActionsService : Service
        {
             public User Get(GetUserRequest request)
             {
             }
        }

        // ...
    }
}

从上面的代码中我们可以看到我们可以有多个文件,所有文件都是分开的和组织的,但是一个程序集供ServiceStack在AppHost中引用:

public AppHost() : base("Pro & Amateur Services", typeof(MyServiceStackApplication).Assembly) {}

使用对MyServiceStackApplication程序集的引用,并使用partial关键字,您可以将代码组织为可管理的分组。

元数据:

不幸的是,不支持按名称空间分隔元数据。您可以自己尝试自定义MetaDataFeature,但它确实看起来像一个有用的功能,能够将它们托管在一个ServiceStack应用程序中的多个服务分开。我建议你提出一个功能请求。

Mythz的功能比闪电更快。 :)似乎他已经在下一个版本中介绍了这一点,你应该能够将自定义过滤器应用到HostContext.Metadata.OperationNamesMap

答案 1 :(得分:2)

如果需要,您可以按照Modularizing Services wiki中的说明在多个dll中拆分多个服务实施。

您可以安全地将服务实现类分组到任何嵌套文件夹分组中,而不会对外部服务产生任何影响。但是,如果您的DTO使用发出包含完整名称空间的类型信息的objectinterfacesabstract类,则更改DTO上的名称空间会产生影响。

在ServiceStack v4.09 +(now on MyGet)中,MetadataFeature包括自定义元数据页面排序的功能,例如,您可以通过以下方式反转元数据页面的顺序:

var metadata = (MetadataFeature)Plugins.First(x => x is MetadataFeature);
metadata.IndexPageFilter = page => {
    page.OperationNames.Sort((x,y) => y.CompareTo(x));
};