想知道是否有一种推荐的最佳实践方法,即将类似服务组合在一起,成为一个越来越大的项目。假设我的大多数服务都可以用于处理“专业”数据或“业余”数据(数据超出表中的简单标志,数据本身完全不同,来自不同的表,在专业或业余方。
我知道我可以为我的班级添加路线......
/亲/服务1 / AM /服务2
看起来我可以将DTO放在命名空间中....
Service.Interface项(服务和工厂类)怎么样?你会把它们放入命名空间吗?
最后,元数据页面是否有办法反映这些分组?我开始走这条路,但所有服务都按字母顺序列出,你看不到service1和service2之间的路由或命名空间差异。
谢谢
答案 0 :(得分:2)
对于复杂的服务,我在一个解决方案中设置了4个项目。
拥有单独的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使用发出包含完整名称空间的类型信息的object
,interfaces
或abstract
类,则更改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));
};