Comparison to ServiceCollection
February 28, 2024 ยท View on GitHub
Microsoft.Extensions.DependencyInjection.ServiceCollection
Create ServiceProvider and register Services
using Microsoft.Extensions.DependencyInjection;
public interface IService1;
public class Service1(IService3 service3) : IService1;
public interface IService2;
public class Service2(IService1 service1, IService3 service3) : IService2;
public interface IService3;
public class Service3 : IService3;
public static class Program {
public static async Task Main() {
#region Definition
ServiceCollection serviceCollection = new();
serviceCollection.AddSingleton<IService1, Service1>();
serviceCollection.AddScoped<IService2, Service2>();
serviceCollection.AddTransient<IService3, Service3>();
#endregion
#region Instance
ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
IService1? service1 = serviceProvider.GetService<IService1>();
IService2? service2 = serviceProvider.GetService<IService2>();
IService3? service3 = serviceProvider.GetService<IService3>();
#endregion
}
}
using CircleDIAttributes;
public interface IService1;
public class Service1(IService3 service3) : IService1;
public interface IService2;
public class Service2(IService1 service1, IService3 service3) : IService2;
public interface IService3;
public class Service3 : IService3;
#region Definition
[ServiceProvider]
[Singleton<IService1, Service1>]
[Scoped<IService2, Service2>]
[Transient<IService3, Service3>]
public sealed partial class MyProvider;
#endregion
public static class Program {
public static async Task Main() {
#region Instance
MyProvider serviceProvider = new();
IService1 service1 = serviceProvider.Service1;
IService2 service2 = serviceProvider.Service2;
IService3 service3 = serviceProvider.Service3;
#endregion
}
}
Register Delegate Service
using Microsoft.Extensions.DependencyInjection;
public delegate string MyDelegate(int number);
public static class Program {
public static void Main() {
#region Definition
ServiceCollection serviceCollection = new();
serviceCollection.AddSingleton<MyDelegate>(_ => static (int number) => number.ToString());
#endregion
#region Instance
ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
MyDelegate? delegateService = serviceProvider.GetService<MyDelegate>();
if (delegateService != null) {
string result = delegateService(5);
Console.WriteLine(result);
}
#endregion
}
}
using CircleDIAttributes;
public delegate string MyDelegate(int number);
#region Definition
[ServiceProvider]
[Delegate<MyDelegate>(nameof(DelegateImpl))]
public sealed partial class MyProvider {
private static string DelegateImpl(int number) => number.ToString();
}
#endregion
public static class Program {
public static void Main() {
#region Instance
MyProvider serviceProvider = new();
MyDelegate delegateService = serviceProvider.MyDelegate;
string result = delegateService(5);
Console.WriteLine(result);
#endregion
}
}
Register Singleton Instance
using Microsoft.Extensions.DependencyInjection;
public interface IService;
public class Service : IService;
public static class Program {
public static void Main() {
Service instance = new();
#region Definition
ServiceCollection serviceCollection = new();
serviceCollection.AddSingleton<IService>(instance);
#endregion
#region Instance
ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
IService? service = serviceProvider.GetService<IService>();
#endregion
}
}
using CircleDIAttributes;
public interface IService;
public class Service : IService;
#region Definition
[ServiceProvider]
[Singleton<IService, Service>(Implementation = nameof(instance))]
public sealed partial class MyProvider {
private readonly Service instance;
public MyProvider(Service service) {
instance = service;
InitServices();
}
}
#endregion
public static class Program {
public static void Main() {
Service instance = new();
#region Instance
MyProvider serviceProvider = new(instance);
IService service = serviceProvider.Service;
#endregion
}
}
Register Factory Method
using Microsoft.Extensions.DependencyInjection;
public interface IService;
public class Service(Guid guid) : IService;
public static class Program {
public static void Main() {
#region Definition
ServiceCollection serviceCollection = new();
serviceCollection.AddTransient<IService>(_ => new Service(Guid.NewGuid()));
#endregion
#region Instance
ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
IService? service = serviceProvider.GetService<IService>();
#endregion
}
}
using CircleDIAttributes;
public interface IService;
public class Service(Guid guid) : IService;
#region Definition
[ServiceProvider]
[Transient<IService, Service>(Implementation = nameof(ServiceFactory))]
public sealed partial class MyProvider {
// can also be a property
private static Service ServiceFactory( /* Dependency Injection works here as well */ ) => new Service(Guid.NewGuid());
}
#endregion
public static class Program {
public static void Main() {
#region Instance
MyProvider serviceProvider = new();
IService service = serviceProvider.Service;
#endregion
}
}
Register Named Service / Keyed Service
using Microsoft.Extensions.DependencyInjection;
public interface IService;
public class Service : IService;
public interface IServiceT;
public class ServiceT([FromKeyedServices("Service1")] IService service1, [FromKeyedServices("Service2")] IService service2) : IServiceT;
public static class Program {
public static void Main() {
#region Definition
ServiceCollection serviceCollection = new();
serviceCollection.AddKeyedSingleton<IService, Service>("Service1");
serviceCollection.AddKeyedSingleton<IService, Service>("Service2");
serviceCollection.AddTransient<IServiceT, ServiceT>();
#endregion
#region Instance
ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
IServiceT? serviceT = serviceProvider.GetService<IServiceT>();
#endregion
}
}
using CircleDIAttributes;
public interface IService;
public class Service : IService;
public interface IServiceT;
public class ServiceT([Dependency(Name = "Service1")] IService service1, [Dependency(Name = "Service2")] IService service2) : IServiceT;
#region Definition
[ServiceProvider]
[Singleton<IService, Service>(Name = "Service1")]
[Singleton<IService, Service>(Name = "Service2")]
[Transient<IServiceT, ServiceT>]
public sealed partial class MyProvider;
#endregion
public static class Program {
public static void Main() {
#region Instance
MyProvider serviceProvider = new();
IServiceT serviceT = serviceProvider.ServiceT;
#endregion
}
}