1+ using System ;
2+ using System . Linq ;
3+ using Microsoft . Extensions . DependencyInjection ;
4+ using Xer . Cqrs . CommandStack ;
5+ using Xer . Cqrs . EventStack ;
6+ using Xer . Delegator . Registrations ;
7+ using Xer . Delegator . Resolvers ;
8+
9+ namespace Xer . Cqrs . Extensions . Microsoft . DependencyInjection
10+ {
11+ internal class CqrsBuilder : ICqrsBuilder
12+ {
13+ private readonly IServiceCollection _serviceCollection ;
14+ private readonly CqrsCommandHandlerSelector _commandHandlerSelector ;
15+ private readonly CqrsEventHandlerSelector _eventHandlerSelector ;
16+
17+ internal CqrsBuilder ( IServiceCollection serviceCollection )
18+ {
19+ _serviceCollection = serviceCollection ;
20+ _commandHandlerSelector = new CqrsCommandHandlerSelector ( serviceCollection ) ;
21+ _eventHandlerSelector = new CqrsEventHandlerSelector ( serviceCollection ) ;
22+ }
23+
24+ public ICqrsBuilder AddCommandHandlers ( Action < ICqrsCommandHandlerSelector > selector )
25+ {
26+ if ( selector == null )
27+ {
28+ throw new ArgumentNullException ( nameof ( selector ) ) ;
29+ }
30+
31+ selector ( _commandHandlerSelector ) ;
32+
33+ _serviceCollection . AddSingleton < CommandDelegator > ( serviceProvider =>
34+ {
35+ CommandHandlerDelegateResolver [ ] messageHandlerResolvers = serviceProvider . GetServices < CommandHandlerDelegateResolver > ( ) . ToArray ( ) ;
36+
37+ if ( messageHandlerResolvers . Length == 1 )
38+ {
39+ return new CommandDelegator ( messageHandlerResolvers [ 0 ] ) ;
40+ }
41+ else if ( messageHandlerResolvers . Length > 1 )
42+ {
43+ return new CommandDelegator ( CompositeMessageHandlerResolver . Compose ( messageHandlerResolvers ) ) ;
44+ }
45+
46+ // Empty delegator.
47+ return new CommandDelegator ( new SingleMessageHandlerRegistration ( ) . BuildMessageHandlerResolver ( ) ) ;
48+ } ) ;
49+
50+ return this ;
51+ }
52+
53+ public ICqrsBuilder AddEventHandlers ( Action < ICqrsEventHandlerSelector > selector )
54+ {
55+ if ( selector == null )
56+ {
57+ throw new ArgumentNullException ( nameof ( selector ) ) ;
58+ }
59+
60+ selector ( _eventHandlerSelector ) ;
61+
62+ _serviceCollection . AddSingleton < EventDelegator > ( serviceProvider =>
63+ {
64+ EventHandlerDelegateResolver [ ] messageHandlerResolvers = serviceProvider . GetServices < EventHandlerDelegateResolver > ( ) . ToArray ( ) ;
65+
66+ if ( messageHandlerResolvers . Length == 1 )
67+ {
68+ return new EventDelegator ( messageHandlerResolvers [ 0 ] ) ;
69+ }
70+ else if ( messageHandlerResolvers . Length > 1 )
71+ {
72+ return new EventDelegator ( CompositeMessageHandlerResolver . Compose ( messageHandlerResolvers ) ) ;
73+ }
74+
75+ // Empty delegator.
76+ return new EventDelegator ( new MultiMessageHandlerRegistration ( ) . BuildMessageHandlerResolver ( ) ) ;
77+ } ) ;
78+
79+ return this ;
80+ }
81+ }
82+ }
0 commit comments