Skip to content

Commit 82ce320

Browse files
committed
Configured static analysis and applied ConfigureAwait(false) to core classes
Fixes #130
1 parent c7597ae commit 82ce320

35 files changed

+157
-89
lines changed

.editorconfig

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,3 +156,41 @@ csharp_space_between_method_call_empty_parameter_list_parentheses = false
156156
# Wrapping preferences
157157
csharp_preserve_single_line_statements = false
158158
csharp_preserve_single_line_blocks = true
159+
160+
161+
###############################
162+
# Reliability Inspections #
163+
###############################
164+
165+
# CA2012: Use ValueTasks correctly
166+
dotnet_diagnostic.CA2012.severity = error
167+
168+
# VSTHRD002 Avoid problematic synchronous waits
169+
dotnet_diagnostic.VSTHRD002.severity = warning
170+
171+
# VSTHRD011 Use AsyncLazy<T>
172+
dotnet_diagnostic.VSTHRD011.severity = warning
173+
174+
# VSTHRD100 Avoid async void methods
175+
dotnet_diagnostic.VSTHRD100.severity = error
176+
177+
# VSTHRD101 Avoid unsupported async delegates
178+
dotnet_diagnostic.VSTHRD101.severity = error
179+
180+
# VSTHRD102 Implement internal logic asynchronously
181+
dotnet_diagnostic.VSTHRD102.severity = error
182+
183+
# VSTHRD103 Call async methods when in an async method
184+
dotnet_diagnostic.VSTHRD103.severity = error
185+
186+
# VSTHRD110 Observe result of async calls
187+
dotnet_diagnostic.VSTHRD110.severity = warning
188+
189+
# VSTHRD111 Use .ConfigureAwait(bool)
190+
dotnet_diagnostic.VSTHRD111.severity = error
191+
192+
# VSTHRD112 Implement System.IAsyncDisposable
193+
dotnet_diagnostic.VSTHRD112.severity = error
194+
195+
# VSTHRD200 Use Async suffix for async methods
196+
dotnet_diagnostic.VSTHRD200.severity = none

Core.Build.props

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project>
3+
<PropertyGroup>
4+
<AnalysisModeReliability>true</AnalysisModeReliability>
5+
<EnableNETAnalyzers>true</EnableNETAnalyzers>
6+
<AnalysisLevel>latest</AnalysisLevel>
7+
</PropertyGroup>
8+
<ItemGroup>
9+
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.4.27" PrivateAssets="All"/>
10+
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="6.0.0" PrivateAssets="All" Condition=" '$(TargetFrawework)' == 'netstandard2.0' "/>
11+
</ItemGroup>
12+
</Project>

Core.ElasticSearch/Core.ElasticSearch.csproj

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,16 @@
66

77

88
<ItemGroup>
9-
<PackageReference Include="NEST" Version="7.17.5" />
10-
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="7.0.0" />
11-
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="7.0.0" />
12-
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
13-
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
9+
<PackageReference Include="NEST" Version="7.17.5"/>
10+
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="7.0.0"/>
11+
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="7.0.0"/>
12+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0"/>
13+
<PackageReference Include="Newtonsoft.Json" Version="13.0.1"/>
1414
</ItemGroup>
1515

1616
<ItemGroup>
17-
<ProjectReference Include="..\Core\Core.csproj" />
17+
<ProjectReference Include="..\Core\Core.csproj"/>
1818
</ItemGroup>
1919

20+
<Import Project="../Core.Build.props"/>
2021
</Project>

Core.ElasticSearch/Projections/ElasticSearchProjection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public async Task Handle(EventEnvelope<TEvent> eventEnvelope, CancellationToken
2828
var id = getId(eventEnvelope.Data);
2929
var indexName = IndexNameMapper.ToIndexName<TView>();
3030

31-
var entity = (await elasticClient.GetAsync<TView>(id, i => i.Index(indexName), ct))?.Source ??
31+
var entity = (await elasticClient.GetAsync<TView>(id, i => i.Index(indexName), ct).ConfigureAwait(false))?.Source ??
3232
(TView) Activator.CreateInstance(typeof(TView), true)!;
3333

3434
entity.When(eventEnvelope);
@@ -37,7 +37,7 @@ await elasticClient.IndexAsync(
3737
entity,
3838
i => i.Index(indexName).Id(id).VersionType(VersionType.External).Version((long)eventEnvelope.Metadata.StreamPosition),
3939
ct
40-
);
40+
).ConfigureAwait(false);
4141
}
4242
}
4343

Core.ElasticSearch/Repository/ElasticSearchRepository.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ IElasticClient elasticClient
2626

2727
public async Task<T?> Find(Guid id, CancellationToken cancellationToken)
2828
{
29-
var response = await elasticClient.GetAsync<T>(id, ct: cancellationToken);
29+
var response = await elasticClient.GetAsync<T>(id, ct: cancellationToken).ConfigureAwait(false);
3030
return response?.Source;
3131
}
3232

Core.EventStoreDB/Core.EventStoreDB.csproj

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,17 @@
66

77

88
<ItemGroup>
9-
<PackageReference Include="EventStore.Client.Grpc.Streams" Version="22.0.0" />
10-
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="7.0.0" />
11-
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="7.0.0" />
12-
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="7.0.0" />
13-
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.0" />
14-
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
9+
<PackageReference Include="EventStore.Client.Grpc.Streams" Version="22.0.0"/>
10+
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="7.0.0"/>
11+
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="7.0.0"/>
12+
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="7.0.0"/>
13+
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.0"/>
14+
<PackageReference Include="Newtonsoft.Json" Version="13.0.1"/>
1515
</ItemGroup>
1616

1717
<ItemGroup>
18-
<ProjectReference Include="..\Core\Core.csproj" />
18+
<ProjectReference Include="..\Core\Core.csproj"/>
1919
</ItemGroup>
2020

21+
<Import Project="../Core.Build.props"/>
2122
</Project>

Core.EventStoreDB/Events/AggregateStreamExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public static class AggregateStreamExtensions
2222
cancellationToken: cancellationToken
2323
);
2424

25-
if (await readResult.ReadState == ReadState.StreamNotFound)
25+
if (await readResult.ReadState.ConfigureAwait(false) == ReadState.StreamNotFound)
2626
return null;
2727

2828
var aggregate = (T)Activator.CreateInstance(typeof(T), true)!;

Core.EventStoreDB/Repository/EventStoreDBRepository.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public Task<ulong> Add(T aggregate, CancellationToken token = default) =>
4545
StreamState.NoStream,
4646
GetEventsToStore(aggregate, TelemetryPropagator.GetPropagationContext(activity)),
4747
cancellationToken: ct
48-
);
48+
).ConfigureAwait(false);
4949
return result.NextExpectedStreamRevision.ToUInt64();
5050
},
5151
token
@@ -63,7 +63,7 @@ public Task<ulong> Update(T aggregate, ulong? expectedRevision = null, Cancellat
6363
nextVersion,
6464
eventsToAppend,
6565
cancellationToken: ct
66-
);
66+
).ConfigureAwait(false);
6767
return result.NextExpectedStreamRevision.ToUInt64();
6868
},
6969
token
@@ -81,7 +81,7 @@ public Task<ulong> Delete(T aggregate, ulong? expectedRevision = null, Cancellat
8181
nextVersion,
8282
eventsToAppend,
8383
cancellationToken: ct
84-
);
84+
).ConfigureAwait(false);
8585
return result.NextExpectedStreamRevision.ToUInt64();
8686
},
8787
token

Core.EventStoreDB/Repository/RepositoryExtensions.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public static async Task<T> Get<T>(
1111
CancellationToken ct
1212
) where T : class, IAggregate
1313
{
14-
var entity = await repository.Find(id, ct);
14+
var entity = await repository.Find(id, ct).ConfigureAwait(false);
1515

1616
return entity ?? throw AggregateNotFoundException.For<T>(id);
1717
}
@@ -24,10 +24,10 @@ public static async Task<ulong> GetAndUpdate<T>(
2424
CancellationToken ct = default
2525
) where T : class, IAggregate
2626
{
27-
var entity = await repository.Get(id, ct);
27+
var entity = await repository.Get(id, ct).ConfigureAwait(false);
2828

2929
action(entity);
3030

31-
return await repository.Update(entity, expectedVersion, ct);
31+
return await repository.Update(entity, expectedVersion, ct).ConfigureAwait(false);
3232
}
3333
}

Core.EventStoreDB/Subscriptions/EventStoreDBSubscriptionCheckpointRepository.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ public EventStoreDBSubscriptionCheckpointRepository(
2222
var result = eventStoreClient.ReadStreamAsync(Direction.Backwards, streamName, StreamPosition.End, 1,
2323
cancellationToken: ct);
2424

25-
if (await result.ReadState == ReadState.StreamNotFound)
25+
if (await result.ReadState.ConfigureAwait(false) == ReadState.StreamNotFound)
2626
{
2727
return null;
2828
}
2929

30-
ResolvedEvent? @event = await result.FirstOrDefaultAsync(ct);
30+
ResolvedEvent? @event = await result.FirstOrDefaultAsync(ct).ConfigureAwait(false);
3131

3232
return @event?.Deserialize<CheckpointStored>()?.Position;
3333
}
@@ -46,7 +46,7 @@ await eventStoreClient.AppendToStreamAsync(
4646
StreamState.StreamExists,
4747
eventToAppend,
4848
cancellationToken: ct
49-
);
49+
).ConfigureAwait(false);
5050
}
5151
catch (WrongExpectedVersionException)
5252
{
@@ -58,15 +58,15 @@ await eventStoreClient.SetStreamMetadataAsync(
5858
StreamState.NoStream,
5959
new StreamMetadata(1),
6060
cancellationToken: ct
61-
);
61+
).ConfigureAwait(false);
6262

6363
// append event again expecting stream to not exist
6464
await eventStoreClient.AppendToStreamAsync(
6565
streamName,
6666
StreamState.NoStream,
6767
eventToAppend,
6868
cancellationToken: ct
69-
);
69+
).ConfigureAwait(false);
7070
}
7171
}
7272

0 commit comments

Comments
 (0)