Skip to content

Commit 48b3d33

Browse files
Refactor example
- Use primary constructors. - Remove unused fields. - Use structured logging. - Use `await using`. - Use HttpClientFactory. - Use async methods where available. - Use collection expressions.
1 parent 9cb9b5f commit 48b3d33

File tree

5 files changed

+53
-78
lines changed

5 files changed

+53
-78
lines changed

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

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,41 +6,33 @@
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();
33-
var response = await client.GetAsync("http://postman-echo.com/status/500");
34-
var content = await response.Content.ReadAsStringAsync();
24+
var content = await client.GetStringAsync("http://postman-echo.com/status/500");
3525
return Ok(content);
3626
}
3727

3828
[HttpPost]
3929
public async Task<ActionResult<string>> Post()
4030
{
41-
var client = new HttpClient();
42-
var response = await client.PostAsync("https://postman-echo.com/post", new StringContent("Hello World"));
31+
using var body = new StringContent("Hello World");
32+
using var response = await client.PostAsync("https://postman-echo.com/post", body);
33+
4334
var content = await response.Content.ReadAsStringAsync();
35+
4436
return Ok(content);
4537
}
4638
}

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: 11 additions & 15 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,20 +24,24 @@ 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

48-
public class LeftPushBody
44+
private class LeftPushBody
4945
{
5046
[Required]
5147
public string? Name { get; set; }

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: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
return new SqlConnection(connectionString);
2929
});
3030

31+
builder.Services.AddHttpClient();
32+
3133
builder.Services.AddControllers();
3234

3335
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle

0 commit comments

Comments
 (0)