Dependency Injection
Avalanche.Service.DependencyInjection.dll adds support to dependency injection.
There are three ways to use dependency injection with Avalanche.Service.IService.
One, is to use Avalanche.Service.IService as a standalone dependency injection implementation.
// Create service descriptor
ServiceDescriptor serviceDescriptor = ServiceDescriptor.Singleton<MyClass, MyClass>();
// Create service provider
IServiceProvider service = Services.Create((ServiceHandlers.Instance, ServiceScopeHandler.Instance, serviceDescriptor), CachePolicies.Default);
// Get service
MyClass instance = (MyClass)service.GetService(typeof(MyClass))!;
Compability requires support handlers: ServiceRequestHandler, ServiceSelfProvider, ServiceProviderSelfProvider and ServiceScopeHandler.
// Create a list of service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddSingleton<MyClass>();
// Create service provider
IServiceProvider service = Services.Create(
(Avalanche.Service.ServiceHandlers.Instance.ServiceRequestHandler,
Avalanche.Service.ServiceHandlers.Instance.ServiceSelfProvider,
Avalanche.Service.ServiceHandlers.Instance.ServiceProviderSelfProvider,
Avalanche.Service.DependencyInjection.ServiceScopeHandler.Instance,
serviceCollection),
CachePolicies.Default
);
// Get service
MyClass instance = (MyClass)service.GetService(typeof(MyClass))!;
Two, is adapt IServiceCollection into Avalanche.Service.IService and System.IServiceProvider as dependency injection implementation.
.BuildAvalancheServiceProvider() converts IServiceCollection and IEnumerable<ServiceDescriptor> into handlers, cache policy, entry policy, cancellation tokens, and cancellation token sources.
// Create service collection
IServiceCollection serviceCollection = new ServiceCollection()
.AddHandlers(ServiceHandlers.Instance)
.AddCachePolicy(CachePolicies.Default)
.AddTransient<MyClass>();
// Create service
using var service = serviceCollection.BuildAvalancheServiceProvider();
// Get service
MyClass instance = (MyClass)service.GetService(typeof(MyClass))!;
Three, is to use IService as another injectible service in microsoft's DI implementation. .AddAvalancheService() adds IService support. Note that, this way handlers do not automatically participate in construction of services.
// Create service collection
IServiceCollection serviceCollection = new ServiceCollection()
.AddAvalancheService()
.AddHandlers(ServiceHandlers.Instance)
.AddCachePolicy(CachePolicies.Default)
.AddTransient<MyClass>();
// Create service provider
using var 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;
}
}
Warning
This dependency injection implementation is experimental.
Full Example
Full example
using System;
using Avalanche.Service;
using Avalanche.Service.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
class di_index
{
public static void Run()
{
{
// <11>
// Create service descriptor
ServiceDescriptor serviceDescriptor = ServiceDescriptor.Singleton<MyClass, MyClass>();
// Create service provider
IServiceProvider service = Services.Create((ServiceHandlers.Instance, ServiceScopeHandler.Instance, serviceDescriptor), CachePolicies.Default);
// Get service
MyClass instance = (MyClass)service.GetService(typeof(MyClass))!;
// </11>
}
{
// <12>
// Create a list of service descriptors
IServiceCollection serviceCollection = new ServiceCollection()
.AddSingleton<MyClass>();
// Create service provider
IServiceProvider service = Services.Create(
(Avalanche.Service.ServiceHandlers.Instance.ServiceRequestHandler,
Avalanche.Service.ServiceHandlers.Instance.ServiceSelfProvider,
Avalanche.Service.ServiceHandlers.Instance.ServiceProviderSelfProvider,
Avalanche.Service.DependencyInjection.ServiceScopeHandler.Instance,
serviceCollection),
CachePolicies.Default
);
// 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 var 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 var 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>
}