Synchronous Query
Get(Request, CancellationToken, IDictionary<string, object>) returns possible value. Null, if no handler produced a request.
// Create service
IService<TypeRequest, Type> service = Services.Create<TypeRequest, Type>(ServiceHandlers.Instance, CachePolicies.Default);
// Create request
TypeRequest request = new TypeRequest("System.String");
// Issue request
Type? type = service.Get(request);
TryGet(Request, out Response, CancellationToken, IDictionary<string, object>) returns true if value was completed.
// Create service
IService<TypeRequest, Type> service = Services.Create<TypeRequest, Type>(ServiceHandlers.Instance, CachePolicies.Default);
// Create request
TypeRequest request = new TypeRequest("System.String");
// Issue request
if (service.TryGet(request, out Type? type)) Console.WriteLine("Got type");
GetRequired(Request, CancellationToken, IDictionary<string, object>) is used when Completed result is expected.
// Issue request
Type type = service.GetRequired(request);
Invoke(Request, CancellationToken, IDictionary<string, object>) calls a service without expecting a response value.
// Handler
Action<IQuery<WakeUpRequest, Avalanche.Void>> wakeupHandler = q => Console.WriteLine("Wake Up!");
// Create service
IService service = Services.Create(wakeupHandler, CachePolicies.Default);
// Create request
WakeUpRequest request = new WakeUpRequest();
// Invoke
service.TryInvoke(request);
struct WakeUpRequest { }
Asynchronous Query
GetAsync(Request, CancellationToken, IDictionary<string, object>) and GetAsyncQuickAbort() executes query asynchronously.
// Issue request
Type? type = await service.GetAsync(request);
GetRequiredAsync(Request, CancellationToken, IDictionary<string, object>) and GetRequiredAsyncQuickAbort() executes query asynchronously and expects a result.
// Issue request
Type type = await service.GetRequiredAsync(request);
InvokeAsync(Request, CancellationToken, IDictionary<string, object>) and InvokeAsyncQuickAbort() calls a service without expecting a response value.
// Handler
Action<IQuery<WakeUpRequest, Avalanche.Void>> wakeupHandler = q => Console.WriteLine("Wake Up!");
// Create service
IService service = Services.Create(wakeupHandler, CachePolicies.Default);
// Create request
WakeUpRequest request = new WakeUpRequest();
// Invoke async
await service.InvokeAsync(request);
struct WakeUpRequest { }
Error Handling
If no handler produced a value and result was Required, then ServiceException is thrown with ServiceEvent.BadQueryNoValue error code.
// Create service
IService<TypeRequest, Type> service = Services.Create<TypeRequest, Type>(ServiceHandlers.Instance, CachePolicies.Default);
// Create request
TypeRequest request = new TypeRequest("System.NotFound");
// Issue request
try
{
Type type = service.GetRequired(request);
}
catch (Exception e) when (e.HResult == Services.StatusCodes.BadQueryNoValue.Code)
{
Console.WriteLine("No result, type not found.");
}
See Events for other error types.
Full Example
Full example
using System;
using System.Threading.Tasks;
using Avalanche.Service;
using Avalanche.Utilities;
public class service_query
{
public async static Task Run()
{
{
// <0>
// Create service
IService<TypeRequest, Type> service = Services.Create<TypeRequest, Type>(ServiceHandlers.Instance, CachePolicies.Default);
// Create request
TypeRequest request = new TypeRequest("System.String");
// Issue request
Type? type = service.Get(request);
// </0>
}
{
// <1>
// Create service
IService<TypeRequest, Type> service = Services.Create<TypeRequest, Type>(ServiceHandlers.Instance, CachePolicies.Default);
// Create request
TypeRequest request = new TypeRequest("System.String");
// Issue request
if (service.TryGet(request, out Type? type)) Console.WriteLine("Got type");
// </1>
}
{
// Create service
IService<TypeRequest, Type> service = Services.Create<TypeRequest, Type>(ServiceHandlers.Instance, CachePolicies.Default);
// Create request
TypeRequest request = new TypeRequest("System.String");
// <2>
// Issue request
Type type = service.GetRequired(request);
// </2>
}
{
// <3>
// Handler
Action<IQuery<WakeUpRequest, Avalanche.Void>> wakeupHandler = q => Console.WriteLine("Wake Up!");
// Create service
IService service = Services.Create(wakeupHandler, CachePolicies.Default);
// Create request
WakeUpRequest request = new WakeUpRequest();
// Invoke
service.TryInvoke(request);
// </3>
}
{
// Create service
IService<TypeRequest, Type> service = Services.Create<TypeRequest, Type>(ServiceHandlers.Instance, CachePolicies.Default);
// Create request
TypeRequest request = new TypeRequest("System.String");
// <11>
// Issue request
Type? type = await service.GetAsync(request);
// </11>
}
{
// Create service
IService<TypeRequest, Type> service = Services.Create<TypeRequest, Type>(ServiceHandlers.Instance, CachePolicies.Default);
// Create request
TypeRequest request = new TypeRequest("System.String");
// <12>
// Issue request
Type type = await service.GetRequiredAsync(request);
// </12>
}
{
// <13>
// Handler
Action<IQuery<WakeUpRequest, Avalanche.Void>> wakeupHandler = q => Console.WriteLine("Wake Up!");
// Create service
IService service = Services.Create(wakeupHandler, CachePolicies.Default);
// Create request
WakeUpRequest request = new WakeUpRequest();
// Invoke async
await service.InvokeAsync(request);
// </13>
}
{
// <20>
// Create service
IService<TypeRequest, Type> service = Services.Create<TypeRequest, Type>(ServiceHandlers.Instance, CachePolicies.Default);
// Create request
TypeRequest request = new TypeRequest("System.NotFound");
// Issue request
try
{
Type type = service.GetRequired(request);
}
catch (Exception e) when (e.HResult == Services.StatusCodes.BadQueryNoValue.Code)
{
Console.WriteLine("No result, type not found.");
}
// </20>
}
}
// <3b>
struct WakeUpRequest { }
// </3b>
}