IServiceDecorator
IServiceDecorator is an interface for objects that can decorate a service in some specific way.
/// <summary>Decorates <see cref="IService"/> in a specific way.</summary>
public interface IServiceDecorator
{
/// <summary>Decorate <paramref name="service"/></summary>
/// <returns>Decorated version of <paramref name="service"/>.</returns>
IServiceBase Decorate(IServiceBase service);
}
IServiceDecoration is for service implementations that indicate that they are a decoration or type-cast.
/// <summary>Indicates that service implementation is decoration.</summary>
public interface IServiceDecoration : IServiceBase
{
/// <summary>Is decoration</summary>
bool IsServiceDecoration { get; }
/// <summary>The underlying <see cref="IService"/> this decoration is derivation of.</summary>
IServiceBase? DecorationSource { get; }
}
Decorator modifies service in a specific way.
// Create service
IService service = Services.Create(ServiceHandlers.Instance);
// Create decorator
IServiceDecorator decorator = new LoggerDecorator(System.Console.Out);
// Decorate to log
IServiceDecoration decoration = (IServiceDecoration)decorator.Decorate(service);
// Query request (is printed)
Type? type = ((IService)decoration).Get<TypeRequest, Type>("System.String");
// Prints: "Get(TypeRequest(System.String, Module=)) = System.String"
public class LoggerDecorator : IServiceDecorator
{
TextWriter output;
public LoggerDecorator(TextWriter output) => this.output = output;
public IServiceBase Decorate(IServiceBase service) => new LoggerDecoration((IService)service, output);
}
public class LoggerDecoration : ServiceDecorationBase, IServiceDecoration
{
TextWriter output;
public LoggerDecoration(IService service, TextWriter output) : base(service) => this.output = output;
public override Response Get<Request, Response>(
in Request request,
CancellationToken cancelToken = default,
IDictionary<string, object>? context = null)
{
Response response = base.Get<Request, Response>(request, cancelToken, context)!;
output.Write($"Get({request}) = {response}");
return response;
}
}
Full Example
Full example
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using Avalanche.Service;
public class service_decoration
{
public static void Run()
{
{
// <01>
// Create service
IService service = Services.Create(ServiceHandlers.Instance);
// Create decorator
IServiceDecorator decorator = new LoggerDecorator(System.Console.Out);
// Decorate to log
IServiceDecoration decoration = (IServiceDecoration)decorator.Decorate(service);
// Query request (is printed)
Type? type = ((IService)decoration).Get<TypeRequest, Type>("System.String");
// Prints: "Get(TypeRequest(System.String, Module=)) = System.String"
// </01>
}
}
// <99>
public class LoggerDecorator : IServiceDecorator
{
TextWriter output;
public LoggerDecorator(TextWriter output) => this.output = output;
public IServiceBase Decorate(IServiceBase service) => new LoggerDecoration((IService)service, output);
}
public class LoggerDecoration : ServiceDecorationBase, IServiceDecoration
{
TextWriter output;
public LoggerDecoration(IService service, TextWriter output) : base(service) => this.output = output;
public override Response Get<Request, Response>(
in Request request,
CancellationToken cancelToken = default,
IDictionary<string, object>? context = null)
{
Response response = base.Get<Request, Response>(request, cancelToken, context)!;
output.Write($"Get({request}) = {response}");
return response;
}
}
// </99>
}