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

loresoft / MediatR.CommandQuery / 14067111219

25 Mar 2025 06:14PM UTC coverage: 59.397% (-0.5%) from 59.879%
14067111219

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%)

113 existing lines in 15 files now uncovered.

1474 of 2344 relevant lines covered (62.88%)

22.57 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);
4✔
22

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

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

30
        return services;
4✔
31
    }
32

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

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

47
        return services;
4✔
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);
2✔
67

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

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

73
        return services;
2✔
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);
32✔
136

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

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

152
        return services;
32✔
153
    }
154

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

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

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

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

176
        return services;
28✔
177
    }
178

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

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

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

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

200
        return services;
28✔
201
    }
202

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

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

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

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

224
        return services;
28✔
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);
28✔
231

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

235
        return services;
28✔
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);
28✔
242

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

246
        return services;
28✔
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