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

loresoft / MediatR.CommandQuery / 9307610999

30 May 2024 06:43PM UTC coverage: 57.741%. Remained the same
9307610999

Pull #513

github

web-flow
Merge e90664f48 into 7184530a4
Pull Request #513: Bump Microsoft.NET.Test.Sdk from 17.9.0 to 17.10.0

348 of 708 branches covered (49.15%)

Branch coverage included in aggregate %.

1032 of 1682 relevant lines covered (61.36%)

19.52 hits per line

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

0.0
/src/MediatR.CommandQuery.Cosmos/DomainServiceExtensions.cs
1
using Cosmos.Abstracts;
2

3
using MediatR.CommandQuery.Behaviors;
4
using MediatR.CommandQuery.Commands;
5
using MediatR.CommandQuery.Cosmos.Handlers;
6
using MediatR.CommandQuery.Definitions;
7
using MediatR.CommandQuery.Extensions;
8
using MediatR.CommandQuery.Queries;
9
using MediatR.CommandQuery.Services;
10

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

14
namespace MediatR.CommandQuery.Cosmos;
15

16
public static class DomainServiceExtensions
17
{
18
    public static IServiceCollection AddEntityQueries<TRepository, TEntity, TReadModel>(this IServiceCollection services)
19
        where TRepository : ICosmosRepository<TEntity>
20
        where TEntity : class, IHaveIdentifier<string>, new()
21
        where TReadModel : class
22
    {
23
        if (services is null)
×
24
            throw new System.ArgumentNullException(nameof(services));
×
25

26
        // standard queries
27
        services.TryAddTransient<IRequestHandler<EntityIdentifierQuery<string, TReadModel>, TReadModel>, EntityIdentifierQueryHandler<TRepository, TEntity, TReadModel>>();
×
28
        services.TryAddTransient<IRequestHandler<EntityIdentifiersQuery<string, TReadModel>, IReadOnlyCollection<TReadModel>>, EntityIdentifiersQueryHandler<TRepository, TEntity, TReadModel>>();
×
29
        services.TryAddTransient<IRequestHandler<EntityPagedQuery<TReadModel>, EntityPagedResult<TReadModel>>, EntityPagedQueryHandler<TRepository, TEntity, TReadModel>>();
×
30
        services.TryAddTransient<IRequestHandler<EntitySelectQuery<TReadModel>, IReadOnlyCollection<TReadModel>>, EntitySelectQueryHandler<TRepository, TEntity, TReadModel>>();
×
31

32
        // pipeline registration, run in order registered
33
        bool supportsTenant = typeof(TReadModel).Implements<IHaveTenant<string>>();
×
34
        if (supportsTenant)
×
35
        {
36
            services.AddTransient<IPipelineBehavior<EntityPagedQuery<TReadModel>, EntityPagedResult<TReadModel>>, TenantPagedQueryBehavior<string, TReadModel>>();
×
37
            services.AddTransient<IPipelineBehavior<EntitySelectQuery<TReadModel>, IReadOnlyCollection<TReadModel>>, TenantSelectQueryBehavior<string, TReadModel>>();
×
38
        }
39

40
        bool supportsDeleted = typeof(TReadModel).Implements<ITrackDeleted>();
×
41
        if (supportsDeleted)
×
42
        {
43
            services.AddTransient<IPipelineBehavior<EntityPagedQuery<TReadModel>, EntityPagedResult<TReadModel>>, DeletedPagedQueryBehavior<TReadModel>>();
×
44
            services.AddTransient<IPipelineBehavior<EntitySelectQuery<TReadModel>, IReadOnlyCollection<TReadModel>>, DeletedSelectQueryBehavior<TReadModel>>();
×
45
        }
46

47
        return services;
×
48
    }
49

50
    public static IServiceCollection AddEntityQueryMemoryCache<TRepository, TEntity, TReadModel>(this IServiceCollection services)
51
        where TRepository : ICosmosRepository<TEntity>
52
        where TEntity : class, IHaveIdentifier<string>, new()
53
    {
54
        if (services is null)
×
55
            throw new System.ArgumentNullException(nameof(services));
×
56

57
        services.AddTransient<IPipelineBehavior<EntityIdentifierQuery<string, TReadModel>, TReadModel>, MemoryCacheQueryBehavior<EntityIdentifierQuery<string, TReadModel>, TReadModel>>();
×
58
        services.AddTransient<IPipelineBehavior<EntityIdentifiersQuery<string, TReadModel>, IReadOnlyCollection<TReadModel>>, MemoryCacheQueryBehavior<EntityIdentifiersQuery<string, TReadModel>, IReadOnlyCollection<TReadModel>>>();
×
59
        services.AddTransient<IPipelineBehavior<EntityPagedQuery<TReadModel>, EntityPagedResult<TReadModel>>, MemoryCacheQueryBehavior<EntityPagedQuery<TReadModel>, EntityPagedResult<TReadModel>>>();
×
60
        services.AddTransient<IPipelineBehavior<EntitySelectQuery<TReadModel>, IReadOnlyCollection<TReadModel>>, MemoryCacheQueryBehavior<EntitySelectQuery<TReadModel>, IReadOnlyCollection<TReadModel>>>();
×
61

62
        return services;
×
63
    }
64

65
    public static IServiceCollection AddEntityQueryDistributedCache<TRepository, TEntity, TReadModel>(this IServiceCollection services)
66
        where TRepository : ICosmosRepository<TEntity>
67
        where TEntity : class, IHaveIdentifier<string>, new()
68
    {
69
        if (services is null)
×
70
            throw new System.ArgumentNullException(nameof(services));
×
71

72
        services.AddTransient<IPipelineBehavior<EntityIdentifierQuery<string, TReadModel>, TReadModel>, DistributedCacheQueryBehavior<EntityIdentifierQuery<string, TReadModel>, TReadModel>>();
×
73
        services.AddTransient<IPipelineBehavior<EntityIdentifiersQuery<string, TReadModel>, IReadOnlyCollection<TReadModel>>, DistributedCacheQueryBehavior<EntityIdentifiersQuery<string, TReadModel>, IReadOnlyCollection<TReadModel>>>();
×
74
        services.AddTransient<IPipelineBehavior<EntityPagedQuery<TReadModel>, EntityPagedResult<TReadModel>>, DistributedCacheQueryBehavior<EntityPagedQuery<TReadModel>, EntityPagedResult<TReadModel>>>();
×
75
        services.AddTransient<IPipelineBehavior<EntitySelectQuery<TReadModel>, IReadOnlyCollection<TReadModel>>, DistributedCacheQueryBehavior<EntitySelectQuery<TReadModel>, IReadOnlyCollection<TReadModel>>>();
×
76

77
        return services;
×
78
    }
79

80

81
    public static IServiceCollection AddEntityCommands<TRepository, TEntity, TReadModel, TCreateModel, TUpdateModel>(this IServiceCollection services)
82
        where TRepository : ICosmosRepository<TEntity>
83
        where TEntity : class, IHaveIdentifier<string>, new()
84
        where TCreateModel : class
85
        where TUpdateModel : class
86
    {
87
        if (services is null)
×
88
            throw new System.ArgumentNullException(nameof(services));
×
89

90
        services.TryAddSingleton<IPrincipalReader, PrincipalReader>();
×
91

92
        services
×
93
            .AddEntityCreateCommand<TRepository, TEntity, TReadModel, TCreateModel>()
×
94
            .AddEntityUpdateCommand<TRepository, TEntity, TReadModel, TUpdateModel>()
×
95
            .AddEntityUpsertCommand<TRepository, TEntity, TReadModel, TUpdateModel>()
×
96
            .AddEntityPatchCommand<TRepository, TEntity, TReadModel>()
×
97
            .AddEntityDeleteCommand<TRepository, TEntity, TReadModel>();
×
98

99
        return services;
×
100
    }
101

102

103
    public static IServiceCollection AddEntityCreateCommand<TRepository, TEntity, TReadModel, TCreateModel>(this IServiceCollection services)
104
        where TRepository : ICosmosRepository<TEntity>
105
        where TEntity : class, IHaveIdentifier<string>, new()
106
        where TCreateModel : class
107
    {
108
        if (services is null)
×
109
            throw new System.ArgumentNullException(nameof(services));
×
110

111
        // standard crud commands
112
        services.TryAddTransient<IRequestHandler<EntityCreateCommand<TCreateModel, TReadModel>, TReadModel>, EntityCreateCommandHandler<TRepository, TEntity, TCreateModel, TReadModel>>();
×
113

114
        // pipeline registration, run in order registered
115
        var createType = typeof(TCreateModel);
×
116
        bool supportsTenant = createType.Implements<IHaveTenant<string>>();
×
117
        if (supportsTenant)
×
118
        {
119
            services.AddTransient<IPipelineBehavior<EntityCreateCommand<TCreateModel, TReadModel>, TReadModel>, TenantDefaultCommandBehavior<string, TCreateModel, TReadModel>>();
×
120
            services.AddTransient<IPipelineBehavior<EntityCreateCommand<TCreateModel, TReadModel>, TReadModel>, TenantAuthenticateCommandBehavior<string, TCreateModel, TReadModel>>();
×
121
        }
122

123
        bool supportsTracking = createType.Implements<ITrackCreated>();
×
124
        if (supportsTracking)
×
125
            services.AddTransient<IPipelineBehavior<EntityCreateCommand<TCreateModel, TReadModel>, TReadModel>, TrackChangeCommandBehavior<TCreateModel, TReadModel>>();
×
126

127
        services.AddTransient<IPipelineBehavior<EntityCreateCommand<TCreateModel, TReadModel>, TReadModel>, ValidateEntityModelCommandBehavior<TCreateModel, TReadModel>>();
×
128
        services.AddTransient<IPipelineBehavior<EntityCreateCommand<TCreateModel, TReadModel>, TReadModel>, EntityChangeNotificationBehavior<string, TCreateModel, TReadModel>>();
×
129

130
        return services;
×
131
    }
132

133
    public static IServiceCollection AddEntityUpdateCommand<TRepository, TEntity, TReadModel, TUpdateModel>(this IServiceCollection services)
134
        where TRepository : ICosmosRepository<TEntity>
135
        where TEntity : class, IHaveIdentifier<string>, new()
136
        where TUpdateModel : class
137
    {
138
        if (services is null)
×
139
            throw new System.ArgumentNullException(nameof(services));
×
140

141
        // allow query for update models
142
        services.TryAddTransient<IRequestHandler<EntityIdentifierQuery<string, TUpdateModel>, TUpdateModel>, EntityIdentifierQueryHandler<TRepository, TEntity, TUpdateModel>>();
×
143
        services.TryAddTransient<IRequestHandler<EntityIdentifiersQuery<string, TUpdateModel>, IReadOnlyCollection<TUpdateModel>>, EntityIdentifiersQueryHandler<TRepository, TEntity, TUpdateModel>>();
×
144

145
        // standard crud commands
146
        services.TryAddTransient<IRequestHandler<EntityUpdateCommand<string, TUpdateModel, TReadModel>, TReadModel>, EntityUpdateCommandHandler<TRepository, TEntity, TUpdateModel, TReadModel>>();
×
147

148
        // pipeline registration, run in order registered
149
        var updateType = typeof(TUpdateModel);
×
150
        bool supportsTenant = updateType.Implements<IHaveTenant<string>>();
×
151
        if (supportsTenant)
×
152
        {
153
            services.AddTransient<IPipelineBehavior<EntityUpdateCommand<string, TUpdateModel, TReadModel>, TReadModel>, TenantDefaultCommandBehavior<string, TUpdateModel, TReadModel>>();
×
154
            services.AddTransient<IPipelineBehavior<EntityUpdateCommand<string, TUpdateModel, TReadModel>, TReadModel>, TenantAuthenticateCommandBehavior<string, TUpdateModel, TReadModel>>();
×
155
        }
156

157
        bool supportsTracking = updateType.Implements<ITrackUpdated>();
×
158
        if (supportsTracking)
×
159
            services.AddTransient<IPipelineBehavior<EntityUpdateCommand<string, TUpdateModel, TReadModel>, TReadModel>, TrackChangeCommandBehavior<TUpdateModel, TReadModel>>();
×
160

161
        services.AddTransient<IPipelineBehavior<EntityUpdateCommand<string, TUpdateModel, TReadModel>, TReadModel>, ValidateEntityModelCommandBehavior<TUpdateModel, TReadModel>>();
×
162
        services.AddTransient<IPipelineBehavior<EntityUpdateCommand<string, TUpdateModel, TReadModel>, TReadModel>, EntityChangeNotificationBehavior<string, TUpdateModel, TReadModel>>();
×
163

164
        return services;
×
165
    }
166

167
    public static IServiceCollection AddEntityUpsertCommand<TRepository, TEntity, TReadModel, TUpdateModel>(this IServiceCollection services)
168
        where TRepository : ICosmosRepository<TEntity>
169
        where TEntity : class, IHaveIdentifier<string>, new()
170
        where TUpdateModel : class
171
    {
172
        if (services is null)
×
173
            throw new System.ArgumentNullException(nameof(services));
×
174

175
        // standard crud commands
176
        services.TryAddTransient<IRequestHandler<EntityUpsertCommand<string, TUpdateModel, TReadModel>, TReadModel>, EntityUpsertCommandHandler<TRepository, TEntity, TUpdateModel, TReadModel>>();
×
177

178
        // pipeline registration, run in order registered
179
        var updateType = typeof(TUpdateModel);
×
180
        bool supportsTenant = updateType.Implements<IHaveTenant<string>>();
×
181
        if (supportsTenant)
×
182
        {
183
            services.AddTransient<IPipelineBehavior<EntityUpsertCommand<string, TUpdateModel, TReadModel>, TReadModel>, TenantDefaultCommandBehavior<string, TUpdateModel, TReadModel>>();
×
184
            services.AddTransient<IPipelineBehavior<EntityUpsertCommand<string, TUpdateModel, TReadModel>, TReadModel>, TenantAuthenticateCommandBehavior<string, TUpdateModel, TReadModel>>();
×
185
        }
186

187
        bool supportsTracking = updateType.Implements<ITrackUpdated>();
×
188
        if (supportsTracking)
×
189
            services.AddTransient<IPipelineBehavior<EntityUpsertCommand<string, TUpdateModel, TReadModel>, TReadModel>, TrackChangeCommandBehavior<TUpdateModel, TReadModel>>();
×
190

191
        services.AddTransient<IPipelineBehavior<EntityUpsertCommand<string, TUpdateModel, TReadModel>, TReadModel>, ValidateEntityModelCommandBehavior<TUpdateModel, TReadModel>>();
×
192
        services.AddTransient<IPipelineBehavior<EntityUpsertCommand<string, TUpdateModel, TReadModel>, TReadModel>, EntityChangeNotificationBehavior<string, TUpdateModel, TReadModel>>();
×
193

194
        return services;
×
195
    }
196

197
    public static IServiceCollection AddEntityPatchCommand<TRepository, TEntity, TReadModel>(this IServiceCollection services)
198
        where TRepository : ICosmosRepository<TEntity>
199
        where TEntity : class, IHaveIdentifier<string>, new()
200
    {
201
        if (services is null)
×
202
            throw new System.ArgumentNullException(nameof(services));
×
203

204
        // standard crud commands
205
        services.TryAddTransient<IRequestHandler<EntityPatchCommand<string, TReadModel>, TReadModel>, EntityPatchCommandHandler<TRepository, TEntity, TReadModel>>();
×
206

207
        // pipeline registration, run in order registered
208
        services.AddTransient<IPipelineBehavior<EntityPatchCommand<string, TReadModel>, TReadModel>, EntityChangeNotificationBehavior<string, TEntity, TReadModel>>();
×
209

210
        return services;
×
211
    }
212

213
    public static IServiceCollection AddEntityDeleteCommand<TRepository, TEntity, TReadModel>(this IServiceCollection services)
214
        where TRepository : ICosmosRepository<TEntity>
215
        where TEntity : class, IHaveIdentifier<string>, new()
216
    {
217
        if (services is null)
×
218
            throw new System.ArgumentNullException(nameof(services));
×
219

220
        // standard crud commands
221
        services.TryAddTransient<IRequestHandler<EntityDeleteCommand<string, TReadModel>, TReadModel>, EntityDeleteCommandHandler<TRepository, TEntity, TReadModel>>();
×
222

223
        // pipeline registration, run in order registered
224
        services.AddTransient<IPipelineBehavior<EntityDeleteCommand<string, TReadModel>, TReadModel>, EntityChangeNotificationBehavior<string, TEntity, TReadModel>>();
×
225

226
        return services;
×
227
    }
228
}
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

© 2025 Coveralls, Inc