@@ -24,6 +24,28 @@ internal CqrsBuilder(IServiceCollection serviceCollection)
2424 _serviceCollection = serviceCollection ;
2525 }
2626
27+ public ICqrsBuilder AddCommandDelegator ( )
28+ {
29+ _serviceCollection . AddSingleton < CommandDelegator > ( serviceProvider =>
30+ {
31+ CommandHandlerDelegateResolver [ ] messageHandlerResolvers = serviceProvider . GetServices < CommandHandlerDelegateResolver > ( ) . ToArray ( ) ;
32+
33+ if ( messageHandlerResolvers . Length > 1 )
34+ {
35+ return new CommandDelegator ( CompositeMessageHandlerResolver . Compose ( messageHandlerResolvers ) ) ;
36+ }
37+ else if ( messageHandlerResolvers . Length == 1 )
38+ {
39+ return new CommandDelegator ( messageHandlerResolvers [ 0 ] ) ;
40+ }
41+
42+ // Empty delegator.
43+ return new CommandDelegator ( new SingleMessageHandlerRegistration ( ) . BuildMessageHandlerResolver ( ) ) ;
44+ } ) ;
45+
46+ return this ;
47+ }
48+
2749 public ICqrsBuilder AddCommandHandlers ( Assembly assembly , ServiceLifetime lifetime = ServiceLifetime . Transient )
2850 {
2951 return AddCommandHandlers ( new [ ] { assembly } , lifetime ) ;
@@ -59,42 +81,38 @@ public ICqrsBuilder AddCommandHandlersAttributes(IEnumerable<Assembly> assemblie
5981 _serviceCollection . Scan ( scan => scan
6082 . FromAssemblies ( assemblies )
6183 // Register classes that has a method marked with [CommandHandler]
62- . AddClasses ( classes => classes . Where ( type => hasHandlerAttributeMethods < CommandHandlerAttribute > ( type ) ) )
84+ . AddClasses ( classes => classes . Where ( type => CommandHandlerAttributeMethod . IsFoundInType ( type ) ) )
6385 . AsSelf ( )
6486 . WithLifetime ( lifetime ) ) ;
65-
66- // Get all types that has methods marked with [CommandHandler] attribute.
67- Type [ ] allTypes = assemblies . SelectMany ( assembly => assembly . GetTypes ( ) )
68- . Where ( type => hasHandlerAttributeMethods < CommandHandlerAttribute > ( type ) )
69- . ToArray ( ) ;
7087
7188 _serviceCollection . AddSingleton < CommandHandlerDelegateResolver > ( serviceProvider =>
7289 {
7390 var singleMessageHandlerRegistration = new SingleMessageHandlerRegistration ( ) ;
74-
75- foreach ( Type type in allTypes )
76- {
77- singleMessageHandlerRegistration . RegisterCommandHandlerAttributes ( ( ) => serviceProvider . GetRequiredService ( type ) ) ;
78- }
91+ singleMessageHandlerRegistration . RegisterCommandHandlerAttributes ( assemblies , serviceProvider . GetRequiredService ) ;
7992
8093 return new CommandHandlerDelegateResolver ( singleMessageHandlerRegistration . BuildMessageHandlerResolver ( ) ) ;
8194 } ) ;
8295
8396 return this ;
8497 }
8598
86- public ICqrsBuilder AddCommandDelegator ( )
99+ public ICqrsBuilder AddEventDelegator ( )
87100 {
88- _serviceCollection . AddSingleton < CommandDelegator > ( serviceProvider =>
101+ _serviceCollection . AddSingleton < EventDelegator > ( serviceProvider =>
89102 {
90- var messageHandlerResolvers = serviceProvider . GetServices < CommandHandlerDelegateResolver > ( ) . ToArray ( ) ;
91-
92- if ( messageHandlerResolvers . Length == 1 )
103+ EventHandlerDelegateResolver [ ] messageHandlerResolvers = serviceProvider . GetServices < EventHandlerDelegateResolver > ( ) . ToArray ( ) ;
104+
105+ if ( messageHandlerResolvers . Length > 1 )
93106 {
94- return new CommandDelegator ( messageHandlerResolvers [ 0 ] ) ;
107+ return new EventDelegator ( CompositeMessageHandlerResolver . Compose ( messageHandlerResolvers ) ) ;
108+ }
109+ else if ( messageHandlerResolvers . Length == 1 )
110+ {
111+ return new EventDelegator ( messageHandlerResolvers [ 0 ] ) ;
95112 }
96113
97- return new CommandDelegator ( CompositeMessageHandlerResolver . Compose ( messageHandlerResolvers ) ) ;
114+ // Empty delegator.
115+ return new EventDelegator ( new MultiMessageHandlerRegistration ( ) . BuildMessageHandlerResolver ( ) ) ;
98116 } ) ;
99117
100118 return this ;
@@ -132,50 +150,19 @@ public ICqrsBuilder AddEventHandlersAttributes(IEnumerable<Assembly> assemblies,
132150 _serviceCollection . Scan ( scan => scan
133151 . FromAssemblies ( assemblies )
134152 // Register classes that has a method marked with [EventHandler]
135- . AddClasses ( classes => classes . Where ( type => hasHandlerAttributeMethods < EventHandlerAttribute > ( type ) ) )
153+ . AddClasses ( classes => classes . Where ( type => EventHandlerAttributeMethod . IsFoundInType ( type ) ) )
136154 . AsSelf ( )
137155 . WithLifetime ( lifetime ) ) ;
138156
139- // Get all types that has methods marked with [EventHandler] attribute.
140- Type [ ] allTypes = assemblies . SelectMany ( assembly => assembly . GetTypes ( ) )
141- . Where ( type => hasHandlerAttributeMethods < EventHandlerAttribute > ( type ) )
142- . ToArray ( ) ;
143-
144157 _serviceCollection . AddSingleton < EventHandlerDelegateResolver > ( serviceProvider =>
145158 {
146159 var multiMessageHandlerRegistration = new MultiMessageHandlerRegistration ( ) ;
147-
148- foreach ( Type type in allTypes )
149- {
150- multiMessageHandlerRegistration . RegisterEventHandlerAttributes ( ( ) => serviceProvider . GetRequiredService ( type ) ) ;
151- }
152-
160+ multiMessageHandlerRegistration . RegisterEventHandlerAttributes ( assemblies , serviceProvider . GetRequiredService ) ;
161+
153162 return new EventHandlerDelegateResolver ( multiMessageHandlerRegistration . BuildMessageHandlerResolver ( ) ) ;
154163 } ) ;
155164
156165 return this ;
157166 }
158-
159- public ICqrsBuilder AddEventDelegator ( )
160- {
161- _serviceCollection . AddSingleton < EventDelegator > ( serviceProvider =>
162- {
163- var messageHandlerResolvers = serviceProvider . GetServices < EventHandlerDelegateResolver > ( ) . ToArray ( ) ;
164-
165- if ( messageHandlerResolvers . Length == 1 )
166- {
167- return new EventDelegator ( messageHandlerResolvers [ 0 ] ) ;
168- }
169-
170- return new EventDelegator ( CompositeMessageHandlerResolver . Compose ( messageHandlerResolvers ) ) ;
171- } ) ;
172-
173- return this ;
174- }
175-
176- private bool hasHandlerAttributeMethods < TAttribute > ( Type type ) where TAttribute : Attribute
177- {
178- return type . GetMethods ( ) . Any ( method => method . GetCustomAttributes ( typeof ( TAttribute ) , true ) . Any ( ) ) ;
179- }
180167 }
181168}
0 commit comments