Dependency Injection
.AddAvalancheService (Avalanche.Service.DependencyInjection.dll) adds service stack to microsoft's dependency injection framework.
// Service collection
IServiceCollection serviceCollection = new ServiceCollection();
// Avalanche.Service
serviceCollection.AddAvalancheService(CachePolicies.Default, EntryPolicy.DisposeValue);
// Services
using (var services = serviceCollection.BuildServiceProvider())
{
// Get avalanche service
IService service = services.GetRequiredService<IService>();
}
.AddAvalancheServiceExtra (Avalanche.Service.Extra.dll) adds extra features, such as recursion resolver.
// Service collection
IServiceCollection serviceCollection = new ServiceCollection();
// Avalanche.Service
serviceCollection
.AddAvalancheService(CachePolicies.Default, EntryPolicy.DisposeValue)
.AddAvalancheServiceExtra(useAsyncHandlers: false);
// Services
using (var services = serviceCollection.BuildServiceProvider())
{
// Get avalanche service
IService service = services.GetRequiredService<IService>();
}
.AddAvalancheConverter (Avalanche.Converter.dll), .AddAvalancheBindings (Avalanche.Binding.dll), .AddAvalancheTypeBindings (Avalanche.Binding.Type dll) add services for respective class libraries.
// Service collection
IServiceCollection serviceCollection = new ServiceCollection();
// Add logging
InitializeLogging(serviceCollection);
// Avalanche.Service
serviceCollection
.AddAvalancheService(CachePolicies.Default, EntryPolicy.DisposeValue)
.AddAvalancheServiceLogger()
.AddAvalancheServiceExtra(useAsyncHandlers: false)
.AddAvalancheConverter()
.AddAvalancheBindings()
.AddAvalancheTypeBindings();
// Services
using (var services = serviceCollection.BuildServiceProvider())
{
// Get avalanche service
IService service = services.GetRequiredService<IService>();
// Create request
ConverterFunctionRequest request = new ConverterFunctionRequest(typeof(DateTime), typeof(String));
// Get converter
Func<DateTime, string> converter = service.GetRequired<ConverterFunctionRequest, Func<DateTime, string>>(request);
// Try converter
Console.WriteLine(converter(DateTime.Now));
}
.AddHandler(Action<IQuery<Request, Response>>) adds delegate as handler. Delegate Action<IQuery> handles every type of query.
// Create sum calculator
Action<IQuery<(int, int), int>> sumCalculator = q => q.Response.SetValue( q.Request.Item1 + q.Request.Item2 );
// Create query logger
Action<IQuery> queryLogger = q => Console.WriteLine(q.Response);
// Service collection
IServiceCollection serviceCollection =
new ServiceCollection()
.AddAvalancheService(CachePolicies.Default, EntryPolicy.DisposeValue)
.AddHandler(queryLogger, order: long.MaxValue)
.AddHandler(sumCalculator);
// Services
using (var services = serviceCollection.BuildServiceProvider())
{
// Get avalanche service
IService service = services.GetRequiredService<IService>();
// Issue request to sumHandler
int sum = service.GetRequired<(int, int), int>((5, 6));
}
Async delegates implement signature for Func<IQuery<Request, Response>, Task> and Func<IQuery, Task>.
// Create async handler
Func<IQuery<string, string>, Task> urlDownloader =
async q => q.Response.SetValue(await new WebClient().DownloadStringTaskAsync(q.Request));
// Avalanche.Service
IServiceCollection serviceCollection =
new ServiceCollection()
.AddAvalancheService(CachePolicies.Default, EntryPolicy.DisposeValue)
.AddHandler(urlDownloader);
// Services
using (var services = serviceCollection.BuildServiceProvider())
{
// Get avalanche service
IService service = services.GetRequiredService<IService>();
// Issue request to urlDownloader
string? www = await service.GetAsync<string, string>("http://avalanche.fi");
}
Cache policy given with .AddAvalancheService(cachePolicy) determines which requests are to be cached.
// Create async handler
Func<IQuery<string, string>, Task> urlDownloader =
async q => q.Response.SetValue(await new WebClient().DownloadStringTaskAsync(q.Request));
// Cache Criteria for string based requests to be cached.
IRequestPolicy<CachePolicy> cachePolicy = CachePolicies.Cache<string>().DontCacheRest();
// Avalanche.Service
IServiceCollection serviceCollection =
new ServiceCollection()
.AddAvalancheService(cachePolicy, EntryPolicy.DisposeValue)
.AddHandler(urlDownloader);
// Services
using (var services = serviceCollection.BuildServiceProvider())
{
// Get avalanche service
IService service = services.GetRequiredService<IService>();
// Issue request to urlDownloader
string? www = await service.GetAsync<string, string>("http://avalanche.fi");
// Get cached result
string? wwwAgain = await service.GetAsync<string, string>("http://avalanche.fi");
// Test if same reference
bool sameReference = Object.ReferenceEquals(www, wwwAgain);
}
.AddHandler<T> adds a IHandlerBase to service collection.
// Service collection
IServiceCollection serviceCollection = new ServiceCollection();
// Avalanche.Service
serviceCollection
.AddAvalancheService(CachePolicies.Default, EntryPolicy.DisposeValue)
.AddHandler<Halver>();
// Services
using (var services = serviceCollection.BuildServiceProvider())
{
// Get avalanche service
IService service = services.GetRequiredService<IService>();
// Issue request to halver
double half = service.GetRequired<double, double>(10.0);
}
/// <summary></summary>
public class Halver : IHandler<double, double>
{
/// <summary></summary>
public void Handle(IQuery<double, double> query)
{
// Already handled
if (query.Handled()) return;
// Assign result
query.Response.SetValue(query.Request / 2);
}
}
Another service can be added as handler with .AddHandler(IServiceBase).
// Create service
IService<ConverterFunctionRequest, Delegate> converterService =
Services.Create<ConverterFunctionRequest, Delegate>(new ConverterHandlers(), CachePolicies.Default);
// Avalanche.Service
IServiceCollection serviceCollection =
new ServiceCollection()
.AddAvalancheService(CachePolicies.Default, EntryPolicy.DisposeValue)
.AddHandler(converterService);
// Services
using (var services = serviceCollection.BuildServiceProvider())
{
// Get avalanche service
IService service = services.GetRequiredService<IService>();
// Create converter request
ConverterFunctionRequest request = new ConverterFunctionRequest(typeof(int), typeof(string));
// Issue request to converterService
Delegate? converter = service.Get<ConverterFunctionRequest, Delegate>(request);
}
If dependency injection collection has CancellationTokenSource, then services will use its token for closing services.
// Service collection
IServiceCollection serviceCollection = new ServiceCollection();
// Avalanche.Service
serviceCollection
.AddAvalancheService(CachePolicies.Default, EntryPolicy.DisposeValue)
.AddSingleton<CancellationTokenSource, CancellationTokenSource>();
// Services
using (var services = serviceCollection.BuildServiceProvider())
{
// Get avalanche service
IService service = services.GetRequiredService<IService>();
// Cancel service
services.GetRequiredService<CancellationTokenSource>().Cancel();
}