• Avalanche
  • Lexical SDK
  • Avalanche SDK
Show / Hide Table of Contents
  • Avalanche.Service
    • Introduction
    • Service
    • Handler
    • Request
    • Dependency Injection
    • Events
    • Examples
      • Quick Start
      • Expression
      • Mapper
  • Avalanche.Accessor
    • Introduction
    • Events
  • Avalanche.DataType
    • Introduction
    • Events
  • Avalanche.Binding
    • Introduction
    • Type
    • Events
  • Avalanche.Serialization
    • Introduction
    • Events
  • Avalanche.Localization
    • Introduction
    • Events
  • Avalanche.Converter
    • Introduction
    • Events
  • Avalanche.FileSystem
    • Introduction
    • Abstractions
      • IFileSystem
        • IFileSystemBrowse
        • IFileSystemCreateDirectory
        • IFileSystemDelete
        • IFileSystemFileAttribute
        • IFileSystemMount
        • IFileSystemMove
        • IFileSystemObserve
        • IFileSystemOpen
      • IEvent
      • IEntry
      • IOption
      • IToken
    • FileSystem
    • VirtualFileSystem
    • MemoryFileSystem
    • EmbeddedFileSystem
    • HttpFileSystem
    • Decoration
    • IFileProvider
    • Events
    • Utilities
      • Dispose
      • File Scanner
      • Visit Tree
      • File Operation
  • Avalanche.Core
    • Introduction
    • Events
  • Avalanche.Utilities
    • Introduction
    • UnicodeString
    • Permutation
    • Tuples
    • StructList

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();
}
Back to top Copyright © 2017-2021 Toni Kalajainen, contact@avalanche.fi