-
Notifications
You must be signed in to change notification settings - Fork 116
/
Copy pathServiceCollectionExtensions.cs
86 lines (69 loc) · 3.89 KB
/
ServiceCollectionExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// Copyright (c) MASA Stack All rights reserved.
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
// ReSharper disable once CheckNamespace
namespace Microsoft.Extensions.DependencyInjection;
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddEventBus(
this IServiceCollection services,
Action<EventBusBuilder>? eventBusBuilder = null)
=> services.AddEventBus(MasaApp.GetAssemblies(), eventBusBuilder);
public static IServiceCollection AddEventBus(
this IServiceCollection services,
IEnumerable<Assembly> assemblies,
Action<EventBusBuilder>? eventBusBuilder = null)
=> services.AddEventBus(assemblies, ServiceLifetime.Scoped, eventBusBuilder);
public static IServiceCollection AddEventBus(
this IServiceCollection services,
IEnumerable<Assembly> assemblies,
ServiceLifetime lifetime,
Action<EventBusBuilder>? eventBusBuilder = null)
{
if (services.Any(service => service.ImplementationType == typeof(EventBusProvider)))
return services;
services.AddSingleton<EventBusProvider>();
services.TryAddEnumerable(new ServiceDescriptor(typeof(IMiddleware<>), typeof(TransactionMiddleware<>), ServiceLifetime.Transient));
var builder = new EventBusBuilder(services);
eventBusBuilder?.Invoke(builder);
MasaArgumentException.ThrowIfNullOrEmptyCollection(assemblies);
var assemblyArray = assemblies.Distinct().ToArray();
var dispatcherOptions = new DispatcherOptions(services, assemblyArray);
services.AddSingleton(typeof(IOptions<DispatcherOptions>),
_ => Microsoft.Extensions.Options.Options.Create(dispatcherOptions));
services.AddSingleton(new SagaDispatcher(services, assemblyArray).Build(lifetime));
services.AddSingleton(new Dispatcher(services, assemblyArray).Build(lifetime));
services.TryAddSingleton<IExceptionStrategyProvider, DefaultExceptionStrategyProvider>();
services.TryAdd(typeof(IExecutionStrategy), typeof(ExecutionStrategy), ServiceLifetime.Singleton);
services.TryAddScoped<IInitializeServiceProvider, InitializeServiceProvider>();
services.AddScoped(typeof(IEventBus), typeof(EventBus));
MasaApp.TrySetServiceCollection(services);
return services;
}
public static IServiceCollection AddTestEventBus(
this IServiceCollection services,
IEnumerable<Assembly> assemblies,
ServiceLifetime lifetime,
Action<EventBusBuilder>? eventBusBuilder = null)
{
if (services.Any(service => service.ImplementationType == typeof(EventBusProvider)))
return services;
services.AddSingleton<EventBusProvider>();
eventBusBuilder?.Invoke(new EventBusBuilder(services));
MasaArgumentException.ThrowIfNullOrEmptyCollection(assemblies);
var assemblyArray = assemblies.Distinct().ToArray();
var dispatcherOptions = new DispatcherOptions(services, assemblyArray);
services.AddSingleton(typeof(IOptions<DispatcherOptions>),
_ => Microsoft.Extensions.Options.Options.Create(dispatcherOptions));
services.AddSingleton(new SagaDispatcher(services, assemblyArray, true).Build(lifetime));
services.AddSingleton(new Dispatcher(services, assemblyArray).Build(lifetime));
services.TryAddSingleton<IExceptionStrategyProvider, DefaultExceptionStrategyProvider>();
services.TryAdd(typeof(IExecutionStrategy), typeof(ExecutionStrategy), ServiceLifetime.Singleton);
services.TryAddScoped<IInitializeServiceProvider, InitializeServiceProvider>();
services.AddTransient(typeof(IMiddleware<>), typeof(TransactionMiddleware<>));
services.AddScoped(typeof(IEventBus), typeof(EventBus));
return services;
}
private sealed class EventBusProvider
{
}
}