ServiceStack - 自动查询和交换客户端模板
ServiceStack - Autoquery & Swapping Client Templates
使用 ServiceStack 的自动查询,我定义了一个简单的 Request DTO(示例如下)。我想交换模板(布局)以使用不同的 Razor 布局(根据 SS 模板交换文档 here)?
请求 DTO 示例:
Route("/customers", "GET")]
public class QueryCustomers : QueryDb<FindFilesResponse>
{
}
布局示例:
_Layout.cshtml 和 _PrintFriendly.cshtml 模板
对于上述查询,我想在客户端级别交换布局。
ClientCanSwapTemplatesAttribute 所做的只是从 HTTP 请求参数填充 IRequest.Items
字典:
public class ClientCanSwapTemplatesAttribute : RequestFilterAttribute
{
public override void Execute(IRequest req, IResponse res, object requestDto)
{
req.Items["View"] = req.GetParam("View");
req.Items["Template"] = req.GetParam("Template");
}
}
因此您可以选择在 Request Filter 中执行此操作,例如:
RegisterTypedRequestFilter<QueryCustomers>((req, res, dto) =>
{
req.Items["View"] = req.GetParam("View");
req.Items["Template"] = req.GetParam("Template");
});
或者为了能够使用Filter Attributes on AutoQuery Services since they're implementation is auto-generated is to create a Custom AutoQuery implementation,例如:
[ClientCanSwapTemplates]
public class MyQueryServices : Service
{
public IAutoQueryDb AutoQuery { get; set; }
//Override with custom implementation
public object Any(QueryCustomers query)
{
var q = AutoQuery.CreateQuery(query, base.Request);
return AutoQuery.Execute(request, q);
}
}
虽然过滤器属性在请求 DTO 上注释时也可以工作,即:
[ClientCanSwapTemplates]
[Route("/customers", "GET")]
public class QueryCustomers { ... }
不鼓励使用它们,因为它们会向您的服务模型添加依赖项。但另一种解决方案可能是在 AppHost 构造函数中使用 add Attributes dynamically,例如:
public class AppHost : AppHostBase
{
public AppHost()
{
typeof(QueryCustomers)
.AddAttributes(new ClientCanSwapTemplatesAttribute());
}
public override void Configure(Container container) { ... }
}
使用 ServiceStack 的自动查询,我定义了一个简单的 Request DTO(示例如下)。我想交换模板(布局)以使用不同的 Razor 布局(根据 SS 模板交换文档 here)?
请求 DTO 示例:
Route("/customers", "GET")]
public class QueryCustomers : QueryDb<FindFilesResponse>
{
}
布局示例: _Layout.cshtml 和 _PrintFriendly.cshtml 模板
对于上述查询,我想在客户端级别交换布局。
ClientCanSwapTemplatesAttribute 所做的只是从 HTTP 请求参数填充 IRequest.Items
字典:
public class ClientCanSwapTemplatesAttribute : RequestFilterAttribute
{
public override void Execute(IRequest req, IResponse res, object requestDto)
{
req.Items["View"] = req.GetParam("View");
req.Items["Template"] = req.GetParam("Template");
}
}
因此您可以选择在 Request Filter 中执行此操作,例如:
RegisterTypedRequestFilter<QueryCustomers>((req, res, dto) =>
{
req.Items["View"] = req.GetParam("View");
req.Items["Template"] = req.GetParam("Template");
});
或者为了能够使用Filter Attributes on AutoQuery Services since they're implementation is auto-generated is to create a Custom AutoQuery implementation,例如:
[ClientCanSwapTemplates]
public class MyQueryServices : Service
{
public IAutoQueryDb AutoQuery { get; set; }
//Override with custom implementation
public object Any(QueryCustomers query)
{
var q = AutoQuery.CreateQuery(query, base.Request);
return AutoQuery.Execute(request, q);
}
}
虽然过滤器属性在请求 DTO 上注释时也可以工作,即:
[ClientCanSwapTemplates]
[Route("/customers", "GET")]
public class QueryCustomers { ... }
不鼓励使用它们,因为它们会向您的服务模型添加依赖项。但另一种解决方案可能是在 AppHost 构造函数中使用 add Attributes dynamically,例如:
public class AppHost : AppHostBase
{
public AppHost()
{
typeof(QueryCustomers)
.AddAttributes(new ClientCanSwapTemplatesAttribute());
}
public override void Configure(Container container) { ... }
}