Skip to content

Commit 10ad08e

Browse files
Refactor example app (#139)
* Update .gitignore - Ignore `build` from docker compose. - Remove redundant lines. * Add recommended VS Code extensions Add Visual Studio Code configuration file for recommended extensions. * Refactor example app - Update NuGet packages to latest versions. - Add Grafana logging. - Remove redundant configuration file. - Add HttpClientFactory. - Use primary constructors. - Use async methods where available. - Use simple using statements. - Use structured logging. - Use collection expressions. - Remove unused fields.
1 parent 5349314 commit 10ad08e

File tree

10 files changed

+77
-101
lines changed

10 files changed

+77
-101
lines changed

.gitignore

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
mono_crash.*
1818

1919
# Build results
20+
[Bb]uild/
2021
[Dd]ebug/
2122
[Dd]ebugPublic/
2223
[Rr]elease/
@@ -243,14 +244,6 @@ ClientBin/
243244
*.publishsettings
244245
orleans.codegen.cs
245246

246-
# Including strong name files can present a security risk
247-
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
248-
#*.snk
249-
250-
# Since there are multiple workflows, uncomment next line to ignore bower_components
251-
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
252-
#bower_components/
253-
254247
# RIA/Silverlight projects
255248
Generated_Code/
256249

.vscode/extensions.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"recommendations": [
3+
"EditorConfig.EditorConfig",
4+
"github.vscode-github-actions",
5+
"ms-dotnettools.csharp"
6+
]
7+
}

examples/net8.0/aspnetcore/Controllers/HttpClientController.cs

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,21 @@
66
using Microsoft.AspNetCore.Mvc;
77

88
namespace aspnetcore.Controllers;
9+
910
[Route("api/[controller]/[action]")]
1011
[ApiController]
11-
public class HttpClientController : ControllerBase
12+
public class HttpClientController(HttpClient client) : ControllerBase
1213
{
13-
private readonly ILogger<HttpClientController> _logger;
14-
15-
public HttpClientController(ILogger<HttpClientController> logger)
16-
{
17-
_logger = logger;
18-
}
19-
2014
[HttpGet]
2115
public async Task<ActionResult<IEnumerable<string>>> Get()
2216
{
23-
var client = new HttpClient();
24-
var response = await client.GetAsync("https://postman-echo.com/get?hello=world");
25-
var content = await response.Content.ReadAsStringAsync();
17+
var content = await client.GetStringAsync("https://postman-echo.com/get?hello=world");
2618
return Ok(content);
2719
}
2820

2921
[HttpGet]
3022
public async Task<ActionResult<IEnumerable<string>>> GetError()
3123
{
32-
var client = new HttpClient();
3324
var response = await client.GetAsync("http://postman-echo.com/status/500");
3425
var content = await response.Content.ReadAsStringAsync();
3526
return Ok(content);
@@ -38,9 +29,11 @@ public async Task<ActionResult<IEnumerable<string>>> GetError()
3829
[HttpPost]
3930
public async Task<ActionResult<string>> Post()
4031
{
41-
var client = new HttpClient();
42-
var response = await client.PostAsync("https://postman-echo.com/post", new StringContent("Hello World"));
32+
using var body = new StringContent("Hello World");
33+
using var response = await client.PostAsync("https://postman-echo.com/post", body);
34+
4335
var content = await response.Content.ReadAsStringAsync();
36+
4437
return Ok(content);
4538
}
4639
}

examples/net8.0/aspnetcore/Controllers/MsSqlController.cs

Lines changed: 26 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,61 +8,53 @@
88
using Microsoft.Data.SqlClient;
99

1010
namespace aspnetcore.Controllers;
11+
1112
[Route("api/[controller]/[action]")]
1213
[ApiController]
13-
public class MsSqlController : ControllerBase
14+
public class MsSqlController(SqlConnection db) : ControllerBase
1415
{
15-
private readonly ILogger<MsSqlController> _logger;
16-
private readonly SqlConnection _db;
17-
18-
public MsSqlController(ILogger<MsSqlController> logger, SqlConnection db)
19-
{
20-
_logger = logger;
21-
_db = db;
22-
}
23-
2416
[HttpGet]
2517
public async Task<ActionResult<IEnumerable<string>>> Tables()
2618
{
27-
this._db.Open();
19+
await db.OpenAsync();
2820

29-
using (var command = _db.CreateCommand())
30-
{
31-
command.CommandText = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES";
32-
var tables = new List<string>();
21+
await using var command = db.CreateCommand();
22+
23+
command.CommandText = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES";
24+
25+
var tables = new List<string>();
3326

34-
using (var reader = await command.ExecuteReaderAsync())
27+
await using (var reader = await command.ExecuteReaderAsync())
28+
{
29+
while (await reader.ReadAsync())
3530
{
36-
while (await reader.ReadAsync())
37-
{
38-
tables.Add(reader.GetString(0));
39-
}
31+
tables.Add(reader.GetString(0));
4032
}
41-
return Ok(tables);
4233
}
34+
35+
return Ok(tables);
4336
}
4437

4538
[HttpGet]
4639
public async Task<ActionResult<IEnumerable<string>>> ServerInfo()
4740
{
48-
this._db.Open();
41+
await db.OpenAsync();
4942

50-
using (var command = _db.CreateCommand())
51-
{
52-
command.CommandText = "sp_server_info";
53-
command.CommandType = CommandType.StoredProcedure;
43+
await using var command = db.CreateCommand();
44+
45+
command.CommandText = "sp_server_info";
46+
command.CommandType = CommandType.StoredProcedure;
5447

55-
var serverInfo = new List<string>();
48+
var serverInfo = new List<string>();
5649

57-
using (var reader = await command.ExecuteReaderAsync())
50+
await using (var reader = await command.ExecuteReaderAsync())
51+
{
52+
while (await reader.ReadAsync())
5853
{
59-
while (await reader.ReadAsync())
60-
{
61-
serverInfo.Add($"ID={reader.GetInt32(0)} , NAME={reader.GetString(1)} , VALUE={reader.GetString(2)}");
62-
}
54+
serverInfo.Add($"ID={reader.GetInt32(0)} , NAME={reader.GetString(1)} , VALUE={reader.GetString(2)}");
6355
}
64-
65-
return Ok(serverInfo);
6656
}
57+
58+
return Ok(serverInfo);
6759
}
6860
}

examples/net8.0/aspnetcore/Controllers/RedisController.cs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,14 @@
88
using StackExchange.Redis;
99

1010
namespace aspnetcore.Controllers;
11+
1112
[Route("api/[controller]/[action]")]
1213
[ApiController]
13-
public class RedisController : ControllerBase
14+
public class RedisController(IDatabase database, ILogger<RedisController> logger) : ControllerBase
1415
{
1516
const string LIST_KEY = "list";
16-
private readonly ILogger<RedisController> _logger;
17-
private IDatabase _redisDb;
18-
19-
public RedisController(ILogger<RedisController> logger, IDatabase database)
20-
{
21-
_logger = logger;
22-
_redisDb = database;
23-
}
2417

2518
[HttpGet]
26-
// public async Task<ActionResult<string>> LeftPush([FromBody] LeftPushBody data)
2719
public async Task<ActionResult<string>> LeftPush()
2820
{
2921
if (!ModelState.IsValid)
@@ -32,16 +24,20 @@ public async Task<ActionResult<string>> LeftPush()
3224
}
3325

3426
var data = new LeftPushBody { Name = "test" };
35-
var length = await _redisDb.ListLeftPushAsync(LIST_KEY, data.Name);
36-
_logger.LogInformation($"LeftPush: {data.Name} - {length}");
27+
var length = await database.ListLeftPushAsync(LIST_KEY, data.Name);
28+
29+
logger.LogInformation("LeftPush: {Name} - {Length}", data.Name, length);
30+
3731
return Ok();
3832
}
3933

4034
[HttpGet]
4135
public async Task<ActionResult<string>> LeftPop()
4236
{
43-
var value = await _redisDb.ListLeftPopAsync(LIST_KEY);
44-
_logger.LogInformation($"LeftPop: {value}");
37+
var value = await database.ListLeftPopAsync(LIST_KEY);
38+
39+
logger.LogInformation("LeftPop: {Value}", value);
40+
4541
return Ok(value);
4642
}
4743

examples/net8.0/aspnetcore/Controllers/WeatherForecastController.cs

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,25 @@
66
using Microsoft.AspNetCore.Mvc;
77

88
namespace aspnetcore.Controllers;
9+
910
[ApiController]
1011
[Route("[controller]")]
1112
public class WeatherForecastController : ControllerBase
1213
{
13-
private static readonly string[] Summaries = new[]
14-
{
14+
private static readonly string[] Summaries =
15+
[
1516
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
16-
};
17-
18-
private readonly ILogger<WeatherForecastController> _logger;
19-
20-
public WeatherForecastController(ILogger<WeatherForecastController> logger)
21-
{
22-
_logger = logger;
23-
}
17+
];
2418

2519
[HttpGet(Name = "GetWeatherForecast")]
2620
public IEnumerable<WeatherForecast> Get()
2721
{
28-
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
22+
return [.. Enumerable.Range(1, 5).Select(index => new WeatherForecast
2923
{
3024
Date = DateTime.Now.AddDays(index),
3125
TemperatureC = Random.Shared.Next(-20, 55),
3226
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
33-
})
34-
.ToArray();
27+
})];
3528
}
3629

3730
public class WeatherForecast

examples/net8.0/aspnetcore/Program.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,45 @@
55

66
using Grafana.OpenTelemetry;
77
using Microsoft.Data.SqlClient;
8+
using OpenTelemetry.Logs;
89
using OpenTelemetry.Trace;
910
using StackExchange.Redis;
1011

1112
var builder = WebApplication.CreateBuilder(args);
13+
14+
builder.Logging.AddOpenTelemetry(builder => builder.UseGrafana());
15+
1216
builder.Services.AddOpenTelemetry()
1317
.WithMetrics(builder => builder.UseGrafana())
1418
.WithTracing(builder => builder.UseGrafana().AddConsoleExporter());
1519

1620
// Redis
17-
builder.Services.AddSingleton<IConnectionMultiplexer>(
18-
sp => ConnectionMultiplexer.Connect("redis:6379"));
19-
builder.Services.AddScoped(
20-
sp => sp.GetRequiredService<IConnectionMultiplexer>().GetDatabase());
21+
builder.Services.AddSingleton<IConnectionMultiplexer>(sp => ConnectionMultiplexer.Connect("redis:6379"));
22+
builder.Services.AddScoped(sp => sp.GetRequiredService<IConnectionMultiplexer>().GetDatabase());
2123

22-
// MSSQL
24+
// Microsoft SQL Server
2325
builder.Services.AddTransient(sp =>
2426
{
2527
var connectionString = "Server=mssql,1433;Database=master;User=sa;Password=Password12345%%;Encrypt=False;TrustServerCertificate=True";
2628
return new SqlConnection(connectionString);
2729
});
2830

31+
builder.Services.AddHttpClient();
32+
2933
builder.Services.AddControllers();
34+
3035
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
3136
builder.Services.AddEndpointsApiExplorer();
3237
builder.Services.AddSwaggerGen();
3338

3439
var app = builder.Build();
40+
3541
app.UseSwagger();
3642
app.UseSwaggerUI();
43+
3744
app.UseAuthorization();
3845
app.MapControllers();
46+
3947
app.MapGet("/", () => Results.Redirect("/swagger"));
48+
4049
app.Run();

examples/net8.0/aspnetcore/appsettings.Development.json

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

examples/net8.0/aspnetcore/appsettings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
"Logging": {
33
"LogLevel": {
44
"Default": "Information",
5-
"Microsoft.AspNetCore": "Warning"
5+
"Microsoft.AspNetCore": "Warning",
6+
"System": "Warning"
67
}
78
},
89
"AllowedHosts": "*"

examples/net8.0/aspnetcore/aspnetcore.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
</PropertyGroup>
1111

1212
<ItemGroup>
13-
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.2.0" />
13+
<PackageReference Include="Microsoft.Data.SqlClient" Version="6.0.2" />
1414
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.20.1" />
15-
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.9.0" />
16-
<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.9.0" />
17-
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
15+
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.12.0" />
16+
<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.12.0" />
17+
<PackageReference Include="Swashbuckle.AspNetCore" Version="8.1.2" />
1818
</ItemGroup>
1919

2020
<ItemGroup>

0 commit comments

Comments
 (0)