Dependency Injection
Avalanche.Service.DependencyInjection.dll adds glue-on support for dependency injection.
There are three ways how dependency injection can be used with Avalanche.Service.
One, is to adapt ServiceDescriptions into handlers and use Avalanche.Service as Avalanche.Service.IService and thus System.IServiceProvider (Avalanche.Service.IService extends System.IServiceProvider).
// Create service descriptor
ServiceDescriptor serviceDescriptor = ServiceDescriptor.Singleton<MyClass, MyClass>();
// Create service provider
IService service = Services.Create((ServiceHandlers.Instance, ServiceScopeHandler.Instance, serviceDescriptor));
// Get service
MyClass instance = (MyClass)service.GetService(typeof(MyClass))!;
On Asp.Net see instructions.
Two, is to build from IServiceCollection into Avalanche.Service as DI implementation (instead of Microsoft's DI implementation).
.BuildAvalancheServiceProvider() builds IService (and IServiceProvider).
// Create service collection
IServiceCollection serviceCollection = new ServiceCollection()
.AddHandlers(ServiceHandlers.Instance)
.AddCachePolicy(CachePolicies.Default)
.AddTransient<MyClass>();
// Create service
using IServiceDisposable service = serviceCollection.BuildAvalancheServiceProvider();
// Get service
MyClass instance = (MyClass)service.GetService(typeof(MyClass))!;
Three, is to use Avalanche.Service.IService as another injectible service in microsoft's DI implementation. .AddAvalancheService() adds ServiceDescriptions for IService. Note that, this way handlers cannot participate in construction of services described with ServiceDescription.
// Create service collection
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheService()
.AddHandlers(ServiceHandlers.Instance)
.AddCachePolicy(CachePolicies.Default)
.AddTransient<MyClass>();
// Create service provider
using ServiceProvider service = serviceCollection.BuildServiceProvider();
// Get service
MyClass instance = (MyClass)service.GetService(typeof(MyClass))!;
IService gets injected.
public class MyClass
{
IService service;
public MyClass(IService service)
{
this.service = service;
}
}
Note
If there is discrepancy between Microsoft's and Avalanche dependency injection implementation, please report it to github issue tracking.
Full Example
Full example
using System;
using Avalanche.Service;
using Microsoft.Extensions.DependencyInjection;
class di_index
{
public static void Run()
{
{
// <11>
// Create service descriptor
ServiceDescriptor serviceDescriptor = ServiceDescriptor.Singleton<MyClass, MyClass>();
// Create service provider
IService service = Services.Create((ServiceHandlers.Instance, ServiceScopeHandler.Instance, serviceDescriptor));
// Get service
MyClass instance = (MyClass)service.GetService(typeof(MyClass))!;
// </11>
}
// The minimum set of handlers is: <b>ServiceRequestHandler</b>, <b>ServiceSelfProvider</b>, <b>ServiceProviderSelfProvider</b> and <b>ServiceScopeHandler</b>.
{
// <12>
// Create a list of service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddSingleton<MyClass>();
// Create service provider
IService service = Services.Create(
(ServiceHandlers.Instance.ServiceRequestHandler, // Avalanche.Service.dll
ServiceHandlers.Instance.ServiceSelfProvider, // Avalanche.Service.dll
ServiceHandlers.Instance.ServiceProviderSelfProvider, // Avalanche.Service.dll
ServiceScopeHandler.Instance, // Avalanche.Service.DependencyInjection.dll
serviceCollection)
);
// Get service
MyClass instance = (MyClass)service.GetService(typeof(MyClass))!;
// </12>
}
{
// <21>
// Create service collection
IServiceCollection serviceCollection = new ServiceCollection()
.AddHandlers(ServiceHandlers.Instance)
.AddCachePolicy(CachePolicies.Default)
.AddTransient<MyClass>();
// Create service
using IServiceDisposable service = serviceCollection.BuildAvalancheServiceProvider();
// Get service
MyClass instance = (MyClass)service.GetService(typeof(MyClass))!;
// </21>
}
{
// <31>
// Create service collection
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheService()
.AddHandlers(ServiceHandlers.Instance)
.AddCachePolicy(CachePolicies.Default)
.AddTransient<MyClass>();
// Create service provider
using ServiceProvider service = serviceCollection.BuildServiceProvider();
// Get service
MyClass instance = (MyClass)service.GetService(typeof(MyClass))!;
// </31>
}
}
// <MyClass>
public class MyClass
{
IService service;
public MyClass(IService service)
{
this.service = service;
}
}
// </MyClass>
}