Recursive queries
IQuery.Service can be used for issuing further recursive or subsequent queries from within the handler implementation.
public class Handler : IHandler<object, object>
{
public void Handle(IQuery<object, object> query)
{
// Cast to string
if (query.Request is not string str) return;
// Parse to int32
if (!Int32.TryParse(str, out int value)) return;
//
ServiceRequest<CultureInfo> cultureInfoRequest = new ServiceRequest<CultureInfo>();
// Recursive request
CultureInfo? cultureInfo = query.Service.Get<ServiceRequest<CultureInfo>, CultureInfo>(cultureInfoRequest, query.CancellationToken, query.Context);
// Cast to string
query.Response.SetValue(value.ToString(cultureInfo));
}
}
Note that, it is generally important to pass on query.CancellationToken and query.Context to subsequent queries. Though query.Context can be cloned and modified if needed.
// Recursive request
var result = query.Service.Get<ServiceRequest<CultureInfo>, CultureInfo>(cultureInfoRequest, query.CancellationToken, query.Context);
entry.LinkFromQuery<FurtherRequest, Response>(service, furtherRequest, cancellationToken) links result of further request to the entry.
// Further request
ServiceRequest<CultureInfo> cultureInfoRequest = new ServiceRequest<CultureInfo>();
// Link result to result of further query
query.Response.LinkFromQuery<ServiceRequest<CultureInfo>, object>(query.Service, cultureInfoRequest, query.CancellationToken);
Full Example
Full example
using System;
using System.Globalization;
using Avalanche.Service;
public class handler_recursion
{
// <01>
public class Handler : IHandler<object, object>
{
public void Handle(IQuery<object, object> query)
{
// Cast to string
if (query.Request is not string str) return;
// Parse to int32
if (!Int32.TryParse(str, out int value)) return;
//
ServiceRequest<CultureInfo> cultureInfoRequest = new ServiceRequest<CultureInfo>();
// Recursive request
CultureInfo? cultureInfo = query.Service.Get<ServiceRequest<CultureInfo>, CultureInfo>(cultureInfoRequest, query.CancellationToken, query.Context);
// Cast to string
query.Response.SetValue(value.ToString(cultureInfo));
}
}
// </01>
public class Handler2 : IHandler<object, object>
{
public void Handle(IQuery<object, object> query)
{
// Cast to string
if (query.Request is not string str) return;
// Parse to int32
if (!Int32.TryParse(str, out int value)) return;
//
ServiceRequest<CultureInfo> cultureInfoRequest = new ServiceRequest<CultureInfo>();
// <02>
// Recursive request
var result = query.Service.Get<ServiceRequest<CultureInfo>, CultureInfo>(cultureInfoRequest, query.CancellationToken, query.Context);
// </02>
// Cast to string
query.Response.SetValue(value.ToString(result));
}
}
public class Handler3 : IHandler<object, object>
{
public void Handle(IQuery<object, object> query)
{
// <03>
// Further request
ServiceRequest<CultureInfo> cultureInfoRequest = new ServiceRequest<CultureInfo>();
// Link result to result of further query
query.Response.LinkFromQuery<ServiceRequest<CultureInfo>, object>(query.Service, cultureInfoRequest, query.CancellationToken);
// </03>
}
}
}