Skip to content

Commit 08f8667

Browse files
committed
Updated handler selector interface signature
1 parent 8288f0e commit 08f8667

File tree

6 files changed

+84
-124
lines changed

6 files changed

+84
-124
lines changed

Src/Xer.Cqrs.Extensions.SimpleInjector/CqrsBuilder.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public ICqrsBuilder RegisterCommandHandlers(Action<ICqrsCommandHandlerSelector>
4343

4444
_container.RegisterSingleton<CommandDelegator>(() =>
4545
{
46-
if (tryGetInstance(out IEnumerable<CommandHandlerDelegateResolver> commandHandlerResolvers))
46+
if (TryGetInstance(out IEnumerable<CommandHandlerDelegateResolver> commandHandlerResolvers))
4747
{
4848
CommandHandlerDelegateResolver[] resolverArray = commandHandlerResolvers.ToArray();
4949

@@ -72,7 +72,7 @@ public ICqrsBuilder RegisterEventHandlers(Action<ICqrsEventHandlerSelector> sele
7272

7373
_container.RegisterSingleton<EventDelegator>(() =>
7474
{
75-
if (tryGetInstance(out IEnumerable<EventHandlerDelegateResolver> eventHandlerResolvers))
75+
if (TryGetInstance(out IEnumerable<EventHandlerDelegateResolver> eventHandlerResolvers))
7676
{
7777
EventHandlerDelegateResolver[] resolverArray = eventHandlerResolvers.ToArray();
7878

@@ -90,7 +90,7 @@ public ICqrsBuilder RegisterEventHandlers(Action<ICqrsEventHandlerSelector> sele
9090
return this;
9191
}
9292

93-
private bool tryGetInstance<T>(out T instance) where T : class
93+
private bool TryGetInstance<T>(out T instance) where T : class
9494
{
9595
instance = _serviceProvider.GetService(typeof(T)) as T;
9696
if (instance == null)

Src/Xer.Cqrs.Extensions.SimpleInjector/CqrsCommandHandlerSelector.cs

Lines changed: 36 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -20,99 +20,83 @@ internal CqrsCommandHandlerSelector(Container container)
2020
_container = container;
2121
}
2222

23-
public ICqrsCommandHandlerSelector ByAttribute(Assembly assembly)
23+
public ICqrsCommandHandlerSelector ByInterface(params Assembly[] assemblies)
2424
{
25-
return ByAttribute(assembly, Lifestyle.Transient);
25+
return ByInterface(Lifestyle.Transient, assemblies);
2626
}
2727

28-
public ICqrsCommandHandlerSelector ByAttribute(Assembly assembly, Lifestyle lifestyle)
28+
public ICqrsCommandHandlerSelector ByInterface(Lifestyle lifeStyle, params Assembly[] assemblies)
2929
{
30-
return ByAttribute(new[] { assembly }, lifestyle);
31-
}
32-
33-
public ICqrsCommandHandlerSelector ByAttribute(IEnumerable<Assembly> assemblies)
34-
{
35-
return ByAttribute(assemblies, Lifestyle.Transient);
36-
}
37-
38-
public ICqrsCommandHandlerSelector ByAttribute(IEnumerable<Assembly> assemblies, Lifestyle lifeStyle)
39-
{
40-
if (assemblies == null)
41-
{
42-
throw new ArgumentNullException(nameof(assemblies));
43-
}
44-
4530
if (lifeStyle == null)
4631
{
4732
throw new ArgumentNullException(nameof(lifeStyle));
4833
}
4934

50-
// Get all types that has methods marked with [CommandHandler] attribute.
51-
IEnumerable<Type> allTypes = assemblies.SelectMany(assembly => assembly.GetTypes())
52-
.Where(type => type.IsClass &&
53-
!type.IsAbstract &&
54-
CommandHandlerAttributeMethod.IsFoundInType(type)).ToArray();
55-
56-
foreach(Type type in allTypes)
35+
if (assemblies == null)
5736
{
58-
// Register type as self.
59-
_container.Register(type, type, lifeStyle);
37+
throw new ArgumentNullException(nameof(assemblies));
6038
}
6139

62-
var singleMessageHandlerRegistration = new SingleMessageHandlerRegistration();
63-
singleMessageHandlerRegistration.RegisterCommandHandlerAttributes(allTypes, _container.GetInstance);
40+
IEnumerable<Assembly> distinctAssemblies = assemblies.Distinct();
6441

42+
_container.Register(typeof(ICommandAsyncHandler<>), distinctAssemblies, lifeStyle);
43+
_container.Register(typeof(ICommandHandler<>), distinctAssemblies, lifeStyle);
44+
6545
// Register resolver.
6646
_container.AppendToCollection(
6747
typeof(CommandHandlerDelegateResolver),
6848
Lifestyle.Singleton.CreateRegistration(() =>
69-
new CommandHandlerDelegateResolver(singleMessageHandlerRegistration.BuildMessageHandlerResolver()),
49+
new CommandHandlerDelegateResolver(
50+
// Combine container async and sync command handler resolver.
51+
CompositeMessageHandlerResolver.Compose(
52+
new ContainerCommandAsyncHandlerResolver(new SimpleInjectorContainerAdapter(_container)),
53+
new ContainerCommandHandlerResolver(new SimpleInjectorContainerAdapter(_container)))),
7054
_container
7155
)
7256
);
7357

7458
return this;
7559
}
7660

77-
public ICqrsCommandHandlerSelector ByInterface(Assembly assembly)
61+
public ICqrsCommandHandlerSelector ByAttribute(params Assembly[] assemblies)
7862
{
79-
return ByInterface(assembly, Lifestyle.Transient);
63+
return ByAttribute(Lifestyle.Transient, assemblies);
8064
}
8165

82-
public ICqrsCommandHandlerSelector ByInterface(Assembly assembly, Lifestyle lifeStyle)
66+
public ICqrsCommandHandlerSelector ByAttribute(Lifestyle lifeStyle, params Assembly[] assemblies)
8367
{
84-
return ByInterface(new[] { assembly }, lifeStyle);
85-
}
86-
87-
public ICqrsCommandHandlerSelector ByInterface(IEnumerable<Assembly> assemblies)
88-
{
89-
return ByInterface(assemblies, Lifestyle.Transient);
90-
}
68+
if (lifeStyle == null)
69+
{
70+
throw new ArgumentNullException(nameof(lifeStyle));
71+
}
9172

92-
public ICqrsCommandHandlerSelector ByInterface(IEnumerable<Assembly> assemblies, Lifestyle lifeStyle)
93-
{
9473
if (assemblies == null)
9574
{
9675
throw new ArgumentNullException(nameof(assemblies));
9776
}
77+
78+
// Get all types that has methods marked with [CommandHandler] attribute from distinct assemblies.
79+
IEnumerable<Type> allTypes = assemblies.Distinct()
80+
.SelectMany(assembly => assembly.GetTypes())
81+
.Where(type => type.IsClass &&
82+
!type.IsAbstract &&
83+
CommandHandlerAttributeMethod.IsFoundInType(type))
84+
.ToArray();
9885

99-
if (lifeStyle == null)
86+
foreach(Type type in allTypes)
10087
{
101-
throw new ArgumentNullException(nameof(lifeStyle));
88+
// Register type as self.
89+
_container.Register(type, type, lifeStyle);
10290
}
10391

104-
_container.Register(typeof(ICommandAsyncHandler<>), assemblies, lifeStyle);
105-
_container.Register(typeof(ICommandHandler<>), assemblies, lifeStyle);
106-
92+
var singleMessageHandlerRegistration = new SingleMessageHandlerRegistration();
93+
singleMessageHandlerRegistration.RegisterCommandHandlerAttributes(allTypes, _container.GetInstance);
94+
10795
// Register resolver.
10896
_container.AppendToCollection(
10997
typeof(CommandHandlerDelegateResolver),
11098
Lifestyle.Singleton.CreateRegistration(() =>
111-
new CommandHandlerDelegateResolver(
112-
// Combine container async and sync command handler resolver.
113-
CompositeMessageHandlerResolver.Compose(
114-
new ContainerCommandAsyncHandlerResolver(new SimpleInjectorContainerAdapter(_container)),
115-
new ContainerCommandHandlerResolver(new SimpleInjectorContainerAdapter(_container)))),
99+
new CommandHandlerDelegateResolver(singleMessageHandlerRegistration.BuildMessageHandlerResolver()),
116100
_container
117101
)
118102
);

Src/Xer.Cqrs.Extensions.SimpleInjector/CqrsEventHandlerSelector.cs

Lines changed: 33 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -19,95 +19,79 @@ internal CqrsEventHandlerSelector(Container container)
1919
_container = container;
2020
}
2121

22-
public ICqrsEventHandlerSelector ByAttribute(Assembly assembly)
22+
public ICqrsEventHandlerSelector ByInterface(params Assembly[] assemblies)
2323
{
24-
return ByAttribute(assembly, Lifestyle.Transient);
24+
return ByInterface(Lifestyle.Transient, assemblies);
2525
}
2626

27-
public ICqrsEventHandlerSelector ByAttribute(Assembly assembly, Lifestyle lifestyle)
27+
public ICqrsEventHandlerSelector ByInterface(Lifestyle lifeStyle, params Assembly[] assemblies)
2828
{
29-
return ByAttribute(new[] { assembly }, lifestyle);
30-
}
31-
32-
public ICqrsEventHandlerSelector ByAttribute(IEnumerable<Assembly> assemblies)
33-
{
34-
return ByAttribute(assemblies, Lifestyle.Transient);
35-
}
36-
37-
public ICqrsEventHandlerSelector ByAttribute(IEnumerable<Assembly> assemblies, Lifestyle lifeStyle)
38-
{
39-
if (assemblies == null)
40-
{
41-
throw new ArgumentNullException(nameof(assemblies));
42-
}
43-
4429
if (lifeStyle == null)
4530
{
4631
throw new ArgumentNullException(nameof(lifeStyle));
4732
}
48-
49-
// Get all types that has methods marked with [EventHandler] attribute.
50-
IEnumerable<Type> allTypes = assemblies.SelectMany(assembly => assembly.GetTypes())
51-
.Where(type => type.IsClass &&
52-
!type.IsAbstract &&
53-
EventHandlerAttributeMethod.IsFoundInType(type)).ToArray();
5433

55-
foreach(Type type in allTypes)
34+
if (assemblies == null)
5635
{
57-
// Register type as self.
58-
_container.Register(type, type, lifeStyle);
36+
throw new ArgumentNullException(nameof(assemblies));
5937
}
60-
61-
var multiMessageHandlerRegistration = new MultiMessageHandlerRegistration();
62-
multiMessageHandlerRegistration.RegisterEventHandlerAttributes(allTypes, _container.GetInstance);
6338

39+
IEnumerable<Assembly> distinctAssemblies = assemblies.Distinct();
40+
41+
_container.Register(typeof(IEventAsyncHandler<>), distinctAssemblies, lifeStyle);
42+
_container.Register(typeof(IEventHandler<>), distinctAssemblies, lifeStyle);
43+
6444
// Register resolver.
6545
_container.AppendToCollection(
6646
typeof(EventHandlerDelegateResolver),
6747
Lifestyle.Singleton.CreateRegistration(() =>
68-
new EventHandlerDelegateResolver(multiMessageHandlerRegistration.BuildMessageHandlerResolver()),
48+
new EventHandlerDelegateResolver(new ContainerEventHandlerResolver(new SimpleInjectorContainerAdapter(_container))),
6949
_container
7050
)
7151
);
7252

7353
return this;
7454
}
7555

76-
public ICqrsEventHandlerSelector ByInterface(Assembly assembly)
77-
{
78-
return ByInterface(assembly, Lifestyle.Transient);
79-
}
80-
81-
public ICqrsEventHandlerSelector ByInterface(Assembly assembly, Lifestyle lifestyle)
56+
public ICqrsEventHandlerSelector ByAttribute(params Assembly[] assemblies)
8257
{
83-
return ByInterface(new[] { assembly }, lifestyle);
58+
return ByAttribute(Lifestyle.Transient, assemblies);
8459
}
8560

86-
public ICqrsEventHandlerSelector ByInterface(IEnumerable<Assembly> assemblies)
61+
public ICqrsEventHandlerSelector ByAttribute(Lifestyle lifeStyle, params Assembly[] assemblies)
8762
{
88-
return ByInterface(assemblies, Lifestyle.Transient);
89-
}
63+
if (lifeStyle == null)
64+
{
65+
throw new ArgumentNullException(nameof(lifeStyle));
66+
}
9067

91-
public ICqrsEventHandlerSelector ByInterface(IEnumerable<Assembly> assemblies, Lifestyle lifeStyle)
92-
{
9368
if (assemblies == null)
9469
{
9570
throw new ArgumentNullException(nameof(assemblies));
9671
}
72+
73+
// Get all types that has methods marked with [EventHandler] attribute from distinct assemblies.
74+
IEnumerable<Type> allTypes = assemblies.Distinct()
75+
.SelectMany(assembly => assembly.GetTypes())
76+
.Where(type => type.IsClass &&
77+
!type.IsAbstract &&
78+
EventHandlerAttributeMethod.IsFoundInType(type))
79+
.ToArray();
9780

98-
if (lifeStyle == null)
81+
foreach(Type type in allTypes)
9982
{
100-
throw new ArgumentNullException(nameof(lifeStyle));
83+
// Register type as self.
84+
_container.Register(type, type, lifeStyle);
10185
}
102-
103-
_container.Register(typeof(IEventAsyncHandler<>), assemblies, lifeStyle);
104-
_container.Register(typeof(IEventHandler<>), assemblies, lifeStyle);
10586

87+
var multiMessageHandlerRegistration = new MultiMessageHandlerRegistration();
88+
multiMessageHandlerRegistration.RegisterEventHandlerAttributes(allTypes, _container.GetInstance);
89+
10690
// Register resolver.
10791
_container.AppendToCollection(
10892
typeof(EventHandlerDelegateResolver),
10993
Lifestyle.Singleton.CreateRegistration(() =>
110-
new EventHandlerDelegateResolver(new ContainerEventHandlerResolver(new SimpleInjectorContainerAdapter(_container))),
94+
new EventHandlerDelegateResolver(multiMessageHandlerRegistration.BuildMessageHandlerResolver()),
11195
_container
11296
)
11397
);

Src/Xer.Cqrs.Extensions.SimpleInjector/ICqrsCommandHandlerSelector.cs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,9 @@ namespace Xer.Cqrs.Extensions.SimpleInjector
66
{
77
public interface ICqrsCommandHandlerSelector
88
{
9-
ICqrsCommandHandlerSelector ByInterface(Assembly assembly);
10-
ICqrsCommandHandlerSelector ByInterface(Assembly assembly, Lifestyle lifestyle);
11-
ICqrsCommandHandlerSelector ByInterface(IEnumerable<Assembly> assemblies);
12-
ICqrsCommandHandlerSelector ByInterface(IEnumerable<Assembly> assemblies, Lifestyle lifestyle);
13-
ICqrsCommandHandlerSelector ByAttribute(Assembly assembly);
14-
ICqrsCommandHandlerSelector ByAttribute(Assembly assembly, Lifestyle lifestyle);
15-
ICqrsCommandHandlerSelector ByAttribute(IEnumerable<Assembly> assemblies);
16-
ICqrsCommandHandlerSelector ByAttribute(IEnumerable<Assembly> assemblies, Lifestyle lifestyle);
9+
ICqrsCommandHandlerSelector ByInterface(params Assembly[] assemblies);
10+
ICqrsCommandHandlerSelector ByInterface(Lifestyle lifestyle, params Assembly[] assemblies);
11+
ICqrsCommandHandlerSelector ByAttribute(params Assembly[] assemblies);
12+
ICqrsCommandHandlerSelector ByAttribute(Lifestyle lifestyle, params Assembly[] assemblies);
1713
}
1814
}

Src/Xer.Cqrs.Extensions.SimpleInjector/ICqrsEventHandlerSelector.cs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,9 @@ namespace Xer.Cqrs.Extensions.SimpleInjector
66
{
77
public interface ICqrsEventHandlerSelector
88
{
9-
ICqrsEventHandlerSelector ByInterface(Assembly assembly);
10-
ICqrsEventHandlerSelector ByInterface(Assembly assembly, Lifestyle lifestyle);
11-
ICqrsEventHandlerSelector ByInterface(IEnumerable<Assembly> assemblies);
12-
ICqrsEventHandlerSelector ByInterface(IEnumerable<Assembly> assemblies, Lifestyle lifestyle);
13-
ICqrsEventHandlerSelector ByAttribute(Assembly assembly);
14-
ICqrsEventHandlerSelector ByAttribute(Assembly assembly, Lifestyle lifestyle);
15-
ICqrsEventHandlerSelector ByAttribute(IEnumerable<Assembly> assemblies);
16-
ICqrsEventHandlerSelector ByAttribute(IEnumerable<Assembly> assemblies, Lifestyle lifestyle);
9+
ICqrsEventHandlerSelector ByInterface(params Assembly[] assemblies);
10+
ICqrsEventHandlerSelector ByInterface(Lifestyle lifestyle, params Assembly[] assemblies);
11+
ICqrsEventHandlerSelector ByAttribute(params Assembly[] assemblies);
12+
ICqrsEventHandlerSelector ByAttribute(Lifestyle lifestyle, params Assembly[] assemblies);
1713
}
1814
}

Tests/Xer.Cqrs.Extensions.SimpleInjector.Tests/SimpleInjectorContainerExtensionsTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public void ShouldRegisterAllCommandHandlersInAssembly()
6060
{
6161
Container container = new Container();
6262
container.RegisterCqrsCore()
63-
.RegisterCommandHandlers(select => select.ByInterface(_handlerAssembly, Lifestyle.Transient));
63+
.RegisterCommandHandlers(select => select.ByInterface(_handlerAssembly));
6464

6565
container.RegisterSingleton(_outputHelper);
6666
container.Verify();
@@ -79,7 +79,7 @@ public void ShouldRegisterAllCommandHandlerAttributesInAssembly()
7979
{
8080
Container container = new Container();
8181
container.RegisterCqrsCore()
82-
.RegisterCommandHandlers(select => select.ByAttribute(_handlerAssembly, Lifestyle.Transient));
82+
.RegisterCommandHandlers(select => select.ByAttribute(Lifestyle.Transient, _handlerAssembly));
8383
container.RegisterSingleton(_outputHelper);
8484
container.Verify();
8585

@@ -102,7 +102,7 @@ public void ShouldRegisterAllEventHandlersInAssembly()
102102
{
103103
Container container = new Container();
104104
container.RegisterCqrsCore()
105-
.RegisterEventHandlers(select => select.ByInterface(_handlerAssembly, Lifestyle.Transient));
105+
.RegisterEventHandlers(select => select.ByInterface(Lifestyle.Transient, _handlerAssembly));
106106

107107
container.RegisterSingleton(_outputHelper);
108108
container.Verify();
@@ -121,7 +121,7 @@ public void ShouldRegisterAllEventHandlerAttributesInAssembly()
121121
{
122122
Container container = new Container();
123123
container.RegisterCqrsCore()
124-
.RegisterEventHandlers(select => select.ByAttribute(_handlerAssembly, Lifestyle.Transient));
124+
.RegisterEventHandlers(select => select.ByAttribute(Lifestyle.Transient, _handlerAssembly));
125125

126126
container.RegisterSingleton(_outputHelper);
127127
container.Verify();

0 commit comments

Comments
 (0)