Exporting
ServiceDescriptor can be exported as field.
public class Module1
{
/// <summary>Singleton</summary>
public static Module1 Instance { get; } = new();
/// <summary>Export ServiceDescriptor</summary>
public ServiceDescriptor Ids = ServiceDescriptor.Singleton<IList<string>>(new string[] { "id-4", "id-5", "id-6" });
/// <summary>Export pre-build action (Invoked only with IHostBuilder)</summary>
public Action<IServiceCollection> PreBuildAction = (IServiceCollection sc) => WriteLine("IService Pre-Build");
/// <summary>Export post-build action (Invoked only with IHostBuilder)</summary>
public Func<IServiceProvider, IServiceProvider> PostBuildAction = (IServiceProvider sp) => { WriteLine("IService Post-Build"); return sp; };
}
[ServiceDescriptor<T>(scope)] can be attached on classes to be exported. The module must inherit IImportsAssembly<Module> to indicate that the assembly is to be scanned for exported classes.
[ServiceDescriptor<IList<string>>(ServiceScope.Singleton)]
public class Ids : List<string>
{
public Ids() { Add("id-1"); Add("id-2"); Add("id-3"); }
}
public class Module2 : IImportsAssembly<Module2>
{
public static Module2 Instance { get; } = new();
}
Importing to IServiceCollection
ServiceDescriptorContainer.ModuleImportCached[module] scans ServiceDescriptors from module instance.
// Initialize service descriptors
IServiceCollection serviceCollection = new ServiceCollection();
ServiceDescriptorContainer.ModuleImportCached[Module1.Instance].WriteTo(serviceCollection);
ServiceDescriptorContainer.ModuleImportCached[Module2.Instance].WriteTo(serviceCollection);
// Build DI
IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
// Query service
IEnumerable<string> ids = serviceProvider.GetRequiredService<IEnumerable<IList<string>>>().SelectMany(a => a);
WriteLine(string.Join(", ", ids)); // "id-4, id-5, id-6, id-1, id-2, id-3"
ModuleImportServiceDescriptor.Cached[module] scans ServiceDescriptors from module instance. This method does not follow dependencies.
ServiceDescriptor[] serviceDescriptors = ModuleImportServiceDescriptor.Cached[Module1.Instance];
Importing to IHostBuilder
HostingContainer.ModuleImportCached[module] scans ServiceDescriptors from module instance.
// Initialize host builder
IHostBuilder hostBuilder = new HostBuilder();
hostBuilder.UseServiceProviderFactory(HostServiceProviderFactory.Instance);
HostingContainer.ModuleImportCached[Module1.Instance].WriteTo(hostBuilder);
HostingContainer.ModuleImportCached[Module2.Instance].WriteTo(hostBuilder);
// Build host
IHost host = hostBuilder.Build();
// Query service
IEnumerable<string> ids = host.Services.GetRequiredService<IEnumerable<IList<string>>>().SelectMany(a => a);
WriteLine(string.Join(", ", ids)); // "id-4, id-5, id-6, id-1, id-2, id-3"
Full Example
Full example
using Avalanche.DependencyInjection;
using Avalanche.Hosting;
using Avalanche.Module;
using Avalanche.Utilities;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using static System.Console;
public class servicecollection
{
public static void Run()
{
{
// <01>
// Initialize service descriptors
IServiceCollection serviceCollection = new ServiceCollection();
ServiceDescriptorContainer.ModuleImportCached[Module1.Instance].WriteTo(serviceCollection);
ServiceDescriptorContainer.ModuleImportCached[Module2.Instance].WriteTo(serviceCollection);
// Build DI
IServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
// Query service
IEnumerable<string> ids = serviceProvider.GetRequiredService<IEnumerable<IList<string>>>().SelectMany(a => a);
WriteLine(string.Join(", ", ids)); // "id-4, id-5, id-6, id-1, id-2, id-3"
// </01>
}
{
// <02>
ServiceDescriptor[] serviceDescriptors = ModuleImportServiceDescriptor.Cached[Module1.Instance];
// </02>
}
{
// <11>
// Initialize host builder
IHostBuilder hostBuilder = new HostBuilder();
hostBuilder.UseServiceProviderFactory(HostServiceProviderFactory.Instance);
HostingContainer.ModuleImportCached[Module1.Instance].WriteTo(hostBuilder);
HostingContainer.ModuleImportCached[Module2.Instance].WriteTo(hostBuilder);
// Build host
IHost host = hostBuilder.Build();
// Query service
IEnumerable<string> ids = host.Services.GetRequiredService<IEnumerable<IList<string>>>().SelectMany(a => a);
WriteLine(string.Join(", ", ids)); // "id-4, id-5, id-6, id-1, id-2, id-3"
// </11>
}
}
// <98>
public class Module1
{
/// <summary>Singleton</summary>
public static Module1 Instance { get; } = new();
/// <summary>Export ServiceDescriptor</summary>
public ServiceDescriptor Ids = ServiceDescriptor.Singleton<IList<string>>(new string[] { "id-4", "id-5", "id-6" });
/// <summary>Export pre-build action (Invoked only with IHostBuilder)</summary>
public Action<IServiceCollection> PreBuildAction = (IServiceCollection sc) => WriteLine("IService Pre-Build");
/// <summary>Export post-build action (Invoked only with IHostBuilder)</summary>
public Func<IServiceProvider, IServiceProvider> PostBuildAction = (IServiceProvider sp) => { WriteLine("IService Post-Build"); return sp; };
}
// </98>
// <99>
[ServiceDescriptor<IList<string>>(ServiceScope.Singleton)]
public class Ids : List<string>
{
public Ids() { Add("id-1"); Add("id-2"); Add("id-3"); }
}
public class Module2 : IImportsAssembly<Module2>
{
public static Module2 Instance { get; } = new();
}
// </99>
}