在 ServiceStack 中动态创建操作和服务

Dynamically creating operations and services in ServiceStack

我正在从事一个 ServiceStack 项目,该项目要求我收集命令列表(我有 200 多个命令),并为每个命令创建一个操作和服务。本质上,我正在制作一个 Commanding API,它将允许用户在不使用 UI(公开我的命令)的情况下发送命令。

我正在尝试做的一个简单示例: (申请开始)

Gather all commands (with some exemptions)
for each command
    make an operation and service for that command
    map the commands attributes to the new operation and service

我 运行 遇到的问题是创建操作和服务。我不确定 ServiceStack 框架是否支持它以允许动态创建服务和操作,但我真的没有运气找到这样做的方法。为了澄清起见,我所说的动态是指在应用程序启动期间从列表中创建命令,而不是即时创建它们。

有人可以阐明我的理解吗?

感谢您提供的任何帮助,

麦克

委托给多个内部服务的单一服务

我首先考虑是否使用使用 a liberal wildcard route 的单个服务实现来接受多种请求类型,然后根据某些参数委托给不同的服务实现,例如:

[Route("/services/{Type}/{PathInfo*})]
public class DynamicService 
{
    public string Type { get; set; }
    public string PathInfo { get; set; }
}

public class DynamicServices : Service
{
    public object Any(DynamicService request)
    {
        if (request.Type == "type1") 
        {
            //Resolve existing Service and call with converted Request DTO
            using (var service = base.ResolveService<Type1Service>())
            {
                return service.Any(request.ConvertTo<Type1Request>());
            }
        }
        else if (request.Type == "type2") { ... }
    }
}

动态生成和注册服务实现

不然可以看看ServiceStack's AutoQuery implementation for an example on how to generate and register dynamic services on the fly。 AutoQuery 查找实现 IQuery<> 接口的请求 DTO,然后生成并注册一个使用它的新服务实现。

它的工作方式基本上与定义的服务相同类,您可以使用代码生成来动态创建服务实现,而不是使用注册现有服务类型,然后可以将其注册到:

appHost.RegisterService(serviceType);

ServiceStack也支持dynamically registering attributes at runtime,例如:

requestDtoType
    .AddAttributes(new RouteAttribute("/custom-route"))
    .AddAttributes(new RestrictAttribute(RequestAttributes.Json));