Skip to content

Commit e52eae8

Browse files
committed
Refactor to match API of other CQRS extension packages
1 parent b604490 commit e52eae8

19 files changed

+395
-226
lines changed

Src/CqrsBuilder.cs

Lines changed: 0 additions & 168 deletions
This file was deleted.

Src/ICqrsBuilder.cs

Lines changed: 0 additions & 20 deletions
This file was deleted.

Src/CommandHandlerDelegateResolver.cs renamed to Src/Xer.Cqrs.Extensions.Microsoft.DependencyInjection/CommandHandlerDelegateResolver.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ internal class CommandHandlerDelegateResolver : IMessageHandlerResolver
77
{
88
private readonly IMessageHandlerResolver _messageHandlerResolver;
99

10-
public CommandHandlerDelegateResolver(IMessageHandlerResolver messageHandlerResolver)
10+
internal CommandHandlerDelegateResolver(IMessageHandlerResolver messageHandlerResolver)
1111
{
1212
_messageHandlerResolver = messageHandlerResolver;
1313
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Reflection;
5+
using System.Runtime.CompilerServices;
6+
using Microsoft.Extensions.DependencyInjection;
7+
using Xer.Cqrs.CommandStack;
8+
using Xer.Cqrs.CommandStack.Attributes;
9+
using Xer.Cqrs.CommandStack.Resolvers;
10+
using Xer.Cqrs.EventStack;
11+
using Xer.Cqrs.EventStack.Attributes;
12+
using Xer.Cqrs.EventStack.Resolvers;
13+
using Xer.Delegator.Registrations;
14+
using Xer.Delegator.Resolvers;
15+
16+
namespace Xer.Cqrs.Extensions.Microsoft.DependencyInjection
17+
{
18+
internal class CqrsBuilder : ICqrsBuilder
19+
{
20+
private readonly IServiceCollection _serviceCollection;
21+
private readonly CqrsCommandHandlerSelector _commandHandlerSelector;
22+
private readonly CqrsEventHandlerSelector _eventHandlerSelector;
23+
24+
internal CqrsBuilder(IServiceCollection serviceCollection)
25+
{
26+
_serviceCollection = serviceCollection;
27+
_commandHandlerSelector = new CqrsCommandHandlerSelector(serviceCollection);
28+
_eventHandlerSelector = new CqrsEventHandlerSelector(serviceCollection);
29+
}
30+
31+
public ICqrsBuilder AddCommandHandlers(Action<ICqrsCommandHandlerSelector> selector)
32+
{
33+
if (selector == null)
34+
{
35+
throw new ArgumentNullException(nameof(selector));
36+
}
37+
38+
selector(_commandHandlerSelector);
39+
40+
_serviceCollection.AddSingleton<CommandDelegator>(serviceProvider =>
41+
{
42+
CommandHandlerDelegateResolver[] messageHandlerResolvers = serviceProvider.GetServices<CommandHandlerDelegateResolver>().ToArray();
43+
44+
if (messageHandlerResolvers.Length == 1)
45+
{
46+
return new CommandDelegator(messageHandlerResolvers[0]);
47+
}
48+
else if (messageHandlerResolvers.Length > 1)
49+
{
50+
return new CommandDelegator(CompositeMessageHandlerResolver.Compose(messageHandlerResolvers));
51+
}
52+
53+
// Empty delegator.
54+
return new CommandDelegator(new SingleMessageHandlerRegistration().BuildMessageHandlerResolver());
55+
});
56+
57+
return this;
58+
}
59+
60+
public ICqrsBuilder AddEventHandlers(Action<ICqrsEventHandlerSelector> selector)
61+
{
62+
if (selector == null)
63+
{
64+
throw new ArgumentNullException(nameof(selector));
65+
}
66+
67+
selector(_eventHandlerSelector);
68+
69+
_serviceCollection.AddSingleton<EventDelegator>(serviceProvider =>
70+
{
71+
EventHandlerDelegateResolver[] messageHandlerResolvers = serviceProvider.GetServices<EventHandlerDelegateResolver>().ToArray();
72+
73+
if (messageHandlerResolvers.Length == 1)
74+
{
75+
return new EventDelegator(messageHandlerResolvers[0]);
76+
}
77+
else if (messageHandlerResolvers.Length > 1)
78+
{
79+
return new EventDelegator(CompositeMessageHandlerResolver.Compose(messageHandlerResolvers));
80+
}
81+
82+
// Empty delegator.
83+
return new EventDelegator(new MultiMessageHandlerRegistration().BuildMessageHandlerResolver());
84+
});
85+
86+
return this;
87+
}
88+
}
89+
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
using System.Collections.Generic;
2+
using System.Reflection;
3+
using Microsoft.Extensions.DependencyInjection;
4+
using Xer.Cqrs.CommandStack;
5+
using Xer.Cqrs.CommandStack.Resolvers;
6+
using Xer.Delegator.Registrations;
7+
using Xer.Delegator.Resolvers;
8+
9+
namespace Xer.Cqrs.Extensions.Microsoft.DependencyInjection
10+
{
11+
internal class CqrsCommandHandlerSelector : ICqrsCommandHandlerSelector
12+
{
13+
private readonly IServiceCollection _serviceCollection;
14+
15+
internal CqrsCommandHandlerSelector(IServiceCollection serviceCollection)
16+
{
17+
_serviceCollection = serviceCollection;
18+
}
19+
20+
public ICqrsCommandHandlerSelector ByInterface(Assembly assembly)
21+
{
22+
return ByInterface(assembly, ServiceLifetime.Transient);
23+
}
24+
25+
public ICqrsCommandHandlerSelector ByInterface(Assembly assembly, ServiceLifetime lifetime)
26+
{
27+
return ByInterface(new[] { assembly }, lifetime);
28+
}
29+
30+
public ICqrsCommandHandlerSelector ByInterface(IEnumerable<Assembly> assemblies)
31+
{
32+
return ByInterface(assemblies, ServiceLifetime.Transient);
33+
}
34+
35+
public ICqrsCommandHandlerSelector ByInterface(IEnumerable<Assembly> assemblies, ServiceLifetime lifetime)
36+
{
37+
if (assemblies == null)
38+
{
39+
throw new System.ArgumentNullException(nameof(assemblies));
40+
}
41+
42+
_serviceCollection.Scan(scan => scan
43+
.FromAssemblies(assemblies)
44+
// Register async and sync command handlers
45+
.AddClasses(classes => classes.AssignableToAny(typeof(ICommandAsyncHandler<>), typeof(ICommandHandler<>)))
46+
.AsImplementedInterfaces()
47+
.WithLifetime(lifetime));
48+
49+
_serviceCollection.AddSingleton<CommandHandlerDelegateResolver>(serviceProvider =>
50+
{
51+
return new CommandHandlerDelegateResolver(
52+
CompositeMessageHandlerResolver.Compose(
53+
new ContainerCommandAsyncHandlerResolver(new ServiceProviderAdapter(serviceProvider)),
54+
new ContainerCommandHandlerResolver(new ServiceProviderAdapter(serviceProvider))));
55+
});
56+
57+
return this;
58+
}
59+
60+
public ICqrsCommandHandlerSelector ByAttribute(Assembly assembly)
61+
{
62+
return ByAttribute(assembly, ServiceLifetime.Transient);
63+
}
64+
65+
public ICqrsCommandHandlerSelector ByAttribute(Assembly assembly, ServiceLifetime lifetime)
66+
{
67+
return ByAttribute(new[] { assembly }, lifetime);
68+
}
69+
70+
public ICqrsCommandHandlerSelector ByAttribute(IEnumerable<Assembly> assemblies)
71+
{
72+
return ByAttribute(assemblies, ServiceLifetime.Transient);
73+
}
74+
75+
public ICqrsCommandHandlerSelector ByAttribute(IEnumerable<Assembly> assemblies, ServiceLifetime lifetime)
76+
{
77+
if (assemblies == null)
78+
{
79+
throw new System.ArgumentNullException(nameof(assemblies));
80+
}
81+
82+
_serviceCollection.Scan(scan => scan
83+
.FromAssemblies(assemblies)
84+
// Register classes that has a method marked with [CommandHandler]
85+
.AddClasses(classes => classes.Where(type => CommandHandlerAttributeMethod.IsFoundInType(type)))
86+
.AsSelf()
87+
.WithLifetime(lifetime));
88+
89+
_serviceCollection.AddSingleton<CommandHandlerDelegateResolver>(serviceProvider =>
90+
{
91+
var singleMessageHandlerRegistration = new SingleMessageHandlerRegistration();
92+
singleMessageHandlerRegistration.RegisterCommandHandlerAttributes(assemblies, serviceProvider.GetRequiredService);
93+
94+
return new CommandHandlerDelegateResolver(singleMessageHandlerRegistration.BuildMessageHandlerResolver());
95+
});
96+
97+
return this;
98+
}
99+
}
100+
}

0 commit comments

Comments
 (0)