• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

loresoft / MediatR.CommandQuery / 14072332199

25 Mar 2025 06:14PM UTC coverage: 59.397%. First build
14072332199

push

github

pwelter34
Update MediatorServiceExtensions.cs

495 of 971 branches covered (50.98%)

Branch coverage included in aggregate %.

0 of 3 new or added lines in 1 file covered. (0.0%)

1474 of 2344 relevant lines covered (62.88%)

27.03 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

72.13
/src/MediatR.CommandQuery/MediatorServiceExtensions.cs
1
using FluentValidation;
2

3
using MediatR.CommandQuery.Behaviors;
4
using MediatR.CommandQuery.Commands;
5
using MediatR.CommandQuery.Definitions;
6
using MediatR.CommandQuery.Dispatcher;
7
using MediatR.CommandQuery.Extensions;
8
using MediatR.CommandQuery.Queries;
9
using MediatR.CommandQuery.Services;
10
using MediatR.NotificationPublishers;
11

12
using Microsoft.Extensions.DependencyInjection;
13
using Microsoft.Extensions.DependencyInjection.Extensions;
14

15
namespace MediatR.CommandQuery;
16

17
public static class MediatorServiceExtensions
18
{
19
    public static IServiceCollection AddMediator(this IServiceCollection services, ServiceLifetime lifetime = ServiceLifetime.Transient)
20
    {
21
        ArgumentNullException.ThrowIfNull(services);
5✔
22

23
        services.TryAdd(new ServiceDescriptor(typeof(IMediator), typeof(Mediator), lifetime));
5✔
24
        services.TryAdd(new ServiceDescriptor(typeof(ISender), (sp) => sp.GetRequiredService<IMediator>(), lifetime));
8✔
25
        services.TryAdd(new ServiceDescriptor(typeof(IPublisher), (sp) => sp.GetRequiredService<IMediator>(), lifetime));
5✔
26
        services.TryAdd(new ServiceDescriptor(typeof(INotificationPublisher), typeof(TaskWhenAllPublisher), lifetime));
5✔
27

28
        services.TryAddSingleton<IPrincipalReader, PrincipalReader>();
5✔
29

30
        return services;
5✔
31
    }
32

33
    public static IServiceCollection AddValidatorsFromAssembly<T>(this IServiceCollection services)
34
    {
35
        ArgumentNullException.ThrowIfNull(services);
5✔
36

37
        // Register validators
38
        var scanner = AssemblyScanner.FindValidatorsInAssemblyContaining<T>();
5✔
39
        foreach (var scanResult in scanner)
174✔
40
        {
41
            //Register as interface
42
            services.TryAdd(new ServiceDescriptor(scanResult.InterfaceType, scanResult.ValidatorType, ServiceLifetime.Singleton));
82✔
43
            //Register as self
44
            services.TryAdd(new ServiceDescriptor(scanResult.ValidatorType, scanResult.ValidatorType, ServiceLifetime.Singleton));
82✔
45
        }
46

47
        return services;
5✔
48
    }
49

50

51
    public static IServiceCollection AddRemoteDispatcher(this IServiceCollection services)
52
    {
53
        ArgumentNullException.ThrowIfNull(services);
×
54

55
        // up to client to register RemoteDispatcher with correct HttpClient
56
        services.TryAddTransient<IDispatcher>(sp => sp.GetRequiredService<RemoteDispatcher>());
×
57
        services.AddOptions<DispatcherOptions>();
×
58

59
        services.TryAddTransient<IDispatcherDataService, DispatcherDataService>();
×
60

61
        return services;
×
62
    }
63

64
    public static IServiceCollection AddServerDispatcher(this IServiceCollection services)
65
    {
66
        ArgumentNullException.ThrowIfNull(services);
3✔
67

68
        services.TryAddTransient<IDispatcher, MediatorDispatcher>();
3✔
69
        services.AddOptions<DispatcherOptions>();
3✔
70

71
        services.TryAddTransient<IDispatcherDataService, DispatcherDataService>();
3✔
72

73
        return services;
3✔
74
    }
75

76

77
    public static IServiceCollection AddEntityQueryMemoryCache<TKey, TReadModel>(this IServiceCollection services)
78
    {
79
        ArgumentNullException.ThrowIfNull(services);
×
80

81
        services.AddTransient<IPipelineBehavior<EntityIdentifierQuery<TKey, TReadModel>, TReadModel>, MemoryCacheQueryBehavior<EntityIdentifierQuery<TKey, TReadModel>, TReadModel>>();
×
82
        services.AddTransient<IPipelineBehavior<EntityIdentifiersQuery<TKey, TReadModel>, IReadOnlyCollection<TReadModel>>, MemoryCacheQueryBehavior<EntityIdentifiersQuery<TKey, TReadModel>, IReadOnlyCollection<TReadModel>>>();
×
83
        services.AddTransient<IPipelineBehavior<EntityPagedQuery<TReadModel>, EntityPagedResult<TReadModel>>, MemoryCacheQueryBehavior<EntityPagedQuery<TReadModel>, EntityPagedResult<TReadModel>>>();
×
84
        services.AddTransient<IPipelineBehavior<EntitySelectQuery<TReadModel>, IReadOnlyCollection<TReadModel>>, MemoryCacheQueryBehavior<EntitySelectQuery<TReadModel>, IReadOnlyCollection<TReadModel>>>();
×
NEW
85
        services.AddTransient<IPipelineBehavior<EntityContinuationQuery<TReadModel>, EntityContinuationResult<TReadModel>>, MemoryCacheQueryBehavior<EntityContinuationQuery<TReadModel>, EntityContinuationResult<TReadModel>>>();
×
86

87
        return services;
×
88
    }
89

90
    public static IServiceCollection AddEntityQueryDistributedCache<TKey, TReadModel>(this IServiceCollection services)
91
    {
92
        ArgumentNullException.ThrowIfNull(services);
×
93

94
        services.AddTransient<IPipelineBehavior<EntityIdentifierQuery<TKey, TReadModel>, TReadModel>, DistributedCacheQueryBehavior<EntityIdentifierQuery<TKey, TReadModel>, TReadModel>>();
×
95
        services.AddTransient<IPipelineBehavior<EntityIdentifiersQuery<TKey, TReadModel>, IReadOnlyCollection<TReadModel>>, DistributedCacheQueryBehavior<EntityIdentifiersQuery<TKey, TReadModel>, IReadOnlyCollection<TReadModel>>>();
×
96
        services.AddTransient<IPipelineBehavior<EntityPagedQuery<TReadModel>, EntityPagedResult<TReadModel>>, DistributedCacheQueryBehavior<EntityPagedQuery<TReadModel>, EntityPagedResult<TReadModel>>>();
×
97
        services.AddTransient<IPipelineBehavior<EntitySelectQuery<TReadModel>, IReadOnlyCollection<TReadModel>>, DistributedCacheQueryBehavior<EntitySelectQuery<TReadModel>, IReadOnlyCollection<TReadModel>>>();
×
NEW
98
        services.AddTransient<IPipelineBehavior<EntityContinuationQuery<TReadModel>, EntityContinuationResult<TReadModel>>, DistributedCacheQueryBehavior<EntityContinuationQuery<TReadModel>, EntityContinuationResult<TReadModel>>>();
×
99

100
        return services;
×
101
    }
102

103
    public static IServiceCollection AddEntityHybridCache<TKey, TReadModel>(this IServiceCollection services)
104
    {
105
        ArgumentNullException.ThrowIfNull(services);
×
106

107
        services.AddTransient<IPipelineBehavior<EntityIdentifierQuery<TKey, TReadModel>, TReadModel>, HybridCacheQueryBehavior<EntityIdentifierQuery<TKey, TReadModel>, TReadModel>>();
×
108
        services.AddTransient<IPipelineBehavior<EntityIdentifiersQuery<TKey, TReadModel>, IReadOnlyCollection<TReadModel>>, HybridCacheQueryBehavior<EntityIdentifiersQuery<TKey, TReadModel>, IReadOnlyCollection<TReadModel>>>();
×
109
        services.AddTransient<IPipelineBehavior<EntityPagedQuery<TReadModel>, EntityPagedResult<TReadModel>>, HybridCacheQueryBehavior<EntityPagedQuery<TReadModel>, EntityPagedResult<TReadModel>>>();
×
110
        services.AddTransient<IPipelineBehavior<EntitySelectQuery<TReadModel>, IReadOnlyCollection<TReadModel>>, HybridCacheQueryBehavior<EntitySelectQuery<TReadModel>, IReadOnlyCollection<TReadModel>>>();
×
NEW
111
        services.AddTransient<IPipelineBehavior<EntityContinuationQuery<TReadModel>, EntityContinuationResult<TReadModel>>, HybridCacheQueryBehavior<EntityContinuationQuery<TReadModel>, EntityContinuationResult<TReadModel>>>();
×
112

113
        return services;
×
114
    }
115

116
    public static IServiceCollection AddEntityHybridCache<TKey, TReadModel, TCreateModel, TUpdateModel>(this IServiceCollection services)
117
    {
118
        ArgumentNullException.ThrowIfNull(services);
×
119

120
        services.AddEntityHybridCache<TKey, TReadModel>();
×
121

122
        services.AddTransient<IPipelineBehavior<EntityCreateCommand<TCreateModel, TReadModel>, TReadModel>, HybridCacheExpireBehavior<EntityCreateCommand<TCreateModel, TReadModel>, TReadModel>>();
×
123
        services.AddTransient<IPipelineBehavior<EntityUpdateCommand<TKey, TUpdateModel, TReadModel>, TReadModel>, HybridCacheExpireBehavior<EntityUpdateCommand<TKey, TUpdateModel, TReadModel>, TReadModel>>();
×
124
        services.AddTransient<IPipelineBehavior<EntityUpsertCommand<TKey, TUpdateModel, TReadModel>, TReadModel>, HybridCacheExpireBehavior<EntityUpsertCommand<TKey, TUpdateModel, TReadModel>, TReadModel>>();
×
125
        services.AddTransient<IPipelineBehavior<EntityPatchCommand<TKey, TReadModel>, TReadModel>, HybridCacheExpireBehavior<EntityPatchCommand<TKey, TReadModel>, TReadModel>>();
×
126
        services.AddTransient<IPipelineBehavior<EntityDeleteCommand<TKey, TReadModel>, TReadModel>, HybridCacheExpireBehavior<EntityDeleteCommand<TKey, TReadModel>, TReadModel>>();
×
127

128
        return services;
×
129
    }
130

131

132
    public static IServiceCollection AddEntityQueryBehaviors<TKey, TReadModel>(this IServiceCollection services)
133
        where TReadModel : class
134
    {
135
        ArgumentNullException.ThrowIfNull(services);
40✔
136

137
        // pipeline registration, run in order registered
138
        bool supportsTenant = typeof(TReadModel).Implements<IHaveTenant<TKey>>();
40✔
139
        if (supportsTenant)
40✔
140
        {
141
            services.AddTransient<IPipelineBehavior<EntityPagedQuery<TReadModel>, EntityPagedResult<TReadModel>>, TenantPagedQueryBehavior<TKey, TReadModel>>();
5✔
142
            services.AddTransient<IPipelineBehavior<EntitySelectQuery<TReadModel>, IReadOnlyCollection<TReadModel>>, TenantSelectQueryBehavior<TKey, TReadModel>>();
5✔
143
        }
144

145
        bool supportsDeleted = typeof(TReadModel).Implements<ITrackDeleted>();
40✔
146
        if (supportsDeleted)
40✔
147
        {
148
            services.AddTransient<IPipelineBehavior<EntityPagedQuery<TReadModel>, EntityPagedResult<TReadModel>>, DeletedPagedQueryBehavior<TReadModel>>();
5✔
149
            services.AddTransient<IPipelineBehavior<EntitySelectQuery<TReadModel>, IReadOnlyCollection<TReadModel>>, DeletedSelectQueryBehavior<TReadModel>>();
5✔
150
        }
151

152
        return services;
40✔
153
    }
154

155
    public static IServiceCollection AddEntityCreateBehaviors<TKey, TReadModel, TCreateModel>(this IServiceCollection services)
156
        where TCreateModel : class
157
    {
158
        ArgumentNullException.ThrowIfNull(services);
35✔
159

160
        // pipeline registration, run in order registered
161
        var createType = typeof(TCreateModel);
35✔
162
        bool supportsTenant = createType.Implements<IHaveTenant<TKey>>();
35✔
163
        if (supportsTenant)
35✔
164
        {
165
            services.AddTransient<IPipelineBehavior<EntityCreateCommand<TCreateModel, TReadModel>, TReadModel>, TenantDefaultCommandBehavior<TKey, TCreateModel, TReadModel>>();
5✔
166
            services.AddTransient<IPipelineBehavior<EntityCreateCommand<TCreateModel, TReadModel>, TReadModel>, TenantAuthenticateCommandBehavior<TKey, TCreateModel, TReadModel>>();
5✔
167
        }
168

169
        bool supportsTracking = createType.Implements<ITrackCreated>();
35✔
170
        if (supportsTracking)
35✔
171
            services.AddTransient<IPipelineBehavior<EntityCreateCommand<TCreateModel, TReadModel>, TReadModel>, TrackChangeCommandBehavior<TCreateModel, TReadModel>>();
35✔
172

173
        services.AddTransient<IPipelineBehavior<EntityCreateCommand<TCreateModel, TReadModel>, TReadModel>, ValidateEntityModelCommandBehavior<TCreateModel, TReadModel>>();
35✔
174
        services.AddTransient<IPipelineBehavior<EntityCreateCommand<TCreateModel, TReadModel>, TReadModel>, EntityChangeNotificationBehavior<TKey, TCreateModel, TReadModel>>();
35✔
175

176
        return services;
35✔
177
    }
178

179
    public static IServiceCollection AddEntityUpdateBehaviors<TKey, TReadModel, TUpdateModel>(this IServiceCollection services)
180
        where TUpdateModel : class
181
    {
182
        ArgumentNullException.ThrowIfNull(services);
35✔
183

184
        // pipeline registration, run in order registered
185
        var updateType = typeof(TUpdateModel);
35✔
186
        bool supportsTenant = updateType.Implements<IHaveTenant<TKey>>();
35✔
187
        if (supportsTenant)
35✔
188
        {
189
            services.AddTransient<IPipelineBehavior<EntityUpdateCommand<TKey, TUpdateModel, TReadModel>, TReadModel>, TenantDefaultCommandBehavior<TKey, TUpdateModel, TReadModel>>();
5✔
190
            services.AddTransient<IPipelineBehavior<EntityUpdateCommand<TKey, TUpdateModel, TReadModel>, TReadModel>, TenantAuthenticateCommandBehavior<TKey, TUpdateModel, TReadModel>>();
5✔
191
        }
192

193
        bool supportsTracking = updateType.Implements<ITrackUpdated>();
35✔
194
        if (supportsTracking)
35✔
195
            services.AddTransient<IPipelineBehavior<EntityUpdateCommand<TKey, TUpdateModel, TReadModel>, TReadModel>, TrackChangeCommandBehavior<TUpdateModel, TReadModel>>();
35✔
196

197
        services.AddTransient<IPipelineBehavior<EntityUpdateCommand<TKey, TUpdateModel, TReadModel>, TReadModel>, ValidateEntityModelCommandBehavior<TUpdateModel, TReadModel>>();
35✔
198
        services.AddTransient<IPipelineBehavior<EntityUpdateCommand<TKey, TUpdateModel, TReadModel>, TReadModel>, EntityChangeNotificationBehavior<TKey, TUpdateModel, TReadModel>>();
35✔
199

200
        return services;
35✔
201
    }
202

203
    public static IServiceCollection AddEntityUpsertBehaviors<TKey, TReadModel, TUpdateModel>(this IServiceCollection services)
204
        where TUpdateModel : class
205
    {
206
        ArgumentNullException.ThrowIfNull(services);
35✔
207

208
        // pipeline registration, run in order registered
209
        var updateType = typeof(TUpdateModel);
35✔
210
        bool supportsTenant = updateType.Implements<IHaveTenant<TKey>>();
35✔
211
        if (supportsTenant)
35✔
212
        {
213
            services.AddTransient<IPipelineBehavior<EntityUpsertCommand<TKey, TUpdateModel, TReadModel>, TReadModel>, TenantDefaultCommandBehavior<TKey, TUpdateModel, TReadModel>>();
5✔
214
            services.AddTransient<IPipelineBehavior<EntityUpsertCommand<TKey, TUpdateModel, TReadModel>, TReadModel>, TenantAuthenticateCommandBehavior<TKey, TUpdateModel, TReadModel>>();
5✔
215
        }
216

217
        bool supportsTracking = updateType.Implements<ITrackUpdated>();
35✔
218
        if (supportsTracking)
35✔
219
            services.AddTransient<IPipelineBehavior<EntityUpsertCommand<TKey, TUpdateModel, TReadModel>, TReadModel>, TrackChangeCommandBehavior<TUpdateModel, TReadModel>>();
35✔
220

221
        services.AddTransient<IPipelineBehavior<EntityUpsertCommand<TKey, TUpdateModel, TReadModel>, TReadModel>, ValidateEntityModelCommandBehavior<TUpdateModel, TReadModel>>();
35✔
222
        services.AddTransient<IPipelineBehavior<EntityUpsertCommand<TKey, TUpdateModel, TReadModel>, TReadModel>, EntityChangeNotificationBehavior<TKey, TUpdateModel, TReadModel>>();
35✔
223

224
        return services;
35✔
225
    }
226

227
    public static IServiceCollection AddEntityPatchBehaviors<TKey, TEntity, TReadModel>(this IServiceCollection services)
228
        where TEntity : class, IHaveIdentifier<TKey>, new()
229
    {
230
        ArgumentNullException.ThrowIfNull(services);
35✔
231

232
        // pipeline registration, run in order registered
233
        services.AddTransient<IPipelineBehavior<EntityPatchCommand<TKey, TReadModel>, TReadModel>, EntityChangeNotificationBehavior<TKey, TEntity, TReadModel>>();
35✔
234

235
        return services;
35✔
236
    }
237

238
    public static IServiceCollection AddEntityDeleteBehaviors<TKey, TEntity, TReadModel>(this IServiceCollection services)
239
        where TEntity : class, IHaveIdentifier<TKey>, new()
240
    {
241
        ArgumentNullException.ThrowIfNull(services);
35✔
242

243
        // pipeline registration, run in order registered
244
        services.AddTransient<IPipelineBehavior<EntityDeleteCommand<TKey, TReadModel>, TReadModel>, EntityChangeNotificationBehavior<TKey, TEntity, TReadModel>>();
35✔
245

246
        return services;
35✔
247
    }
248
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc