Skip to content

Commit 45839ff

Browse files
committed
refactor: use C# 12 primary constructors for injected deps
1 parent e7999ef commit 45839ff

File tree

3 files changed

+45
-64
lines changed

3 files changed

+45
-64
lines changed

src/Dotnet.Samples.AspNetCore.WebApi/Controllers/PlayerController.cs

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,6 @@ public class PlayerController(
1515
IValidator<PlayerRequestModel> validator
1616
) : ControllerBase
1717
{
18-
private readonly IPlayerService _playerService = playerService;
19-
private readonly ILogger<PlayerController> _logger = logger;
20-
private readonly IValidator<PlayerRequestModel> validator = validator;
21-
2218
/* -------------------------------------------------------------------------
2319
* HTTP POST
2420
* ---------------------------------------------------------------------- */
@@ -45,16 +41,16 @@ public async Task<IResult> PostAsync([FromBody] PlayerRequestModel player)
4541
.Errors.Select(error => new { error.PropertyName, error.ErrorMessage })
4642
.ToArray();
4743

48-
_logger.LogWarning("POST validation failed: {@Errors}", errors);
44+
logger.LogWarning("POST validation failed: {@Errors}", errors);
4945
return TypedResults.BadRequest(errors);
5046
}
5147

52-
if (await _playerService.RetrieveByIdAsync(player.Id) != null)
48+
if (await playerService.RetrieveByIdAsync(player.Id) != null)
5349
{
5450
return TypedResults.Conflict();
5551
}
5652

57-
var result = await _playerService.CreateAsync(player);
53+
var result = await playerService.CreateAsync(player);
5854

5955
return TypedResults.CreatedAtRoute(
6056
routeName: "GetById",
@@ -77,7 +73,7 @@ public async Task<IResult> PostAsync([FromBody] PlayerRequestModel player)
7773
[ProducesResponseType(StatusCodes.Status404NotFound)]
7874
public async Task<IResult> GetAsync()
7975
{
80-
var players = await _playerService.RetrieveAsync();
76+
var players = await playerService.RetrieveAsync();
8177

8278
if (players.Count > 0)
8379
{
@@ -100,7 +96,7 @@ public async Task<IResult> GetAsync()
10096
[ProducesResponseType(StatusCodes.Status404NotFound)]
10197
public async Task<IResult> GetByIdAsync([FromRoute] long id)
10298
{
103-
var player = await _playerService.RetrieveByIdAsync(id);
99+
var player = await playerService.RetrieveByIdAsync(id);
104100

105101
if (player != null)
106102
{
@@ -123,7 +119,7 @@ public async Task<IResult> GetByIdAsync([FromRoute] long id)
123119
[ProducesResponseType(StatusCodes.Status404NotFound)]
124120
public async Task<IResult> GetBySquadNumberAsync([FromRoute] int squadNumber)
125121
{
126-
var player = await _playerService.RetrieveBySquadNumberAsync(squadNumber);
122+
var player = await playerService.RetrieveBySquadNumberAsync(squadNumber);
127123

128124
if (player != null)
129125
{
@@ -162,16 +158,16 @@ public async Task<IResult> PutAsync([FromRoute] long id, [FromBody] PlayerReques
162158
.Errors.Select(error => new { error.PropertyName, error.ErrorMessage })
163159
.ToArray();
164160

165-
_logger.LogWarning("PUT /players/{Id} validation failed: {@Errors}", id, errors);
161+
logger.LogWarning("PUT /players/{Id} validation failed: {@Errors}", id, errors);
166162
return TypedResults.BadRequest(errors);
167163
}
168164

169-
if (await _playerService.RetrieveByIdAsync(id) == null)
165+
if (await playerService.RetrieveByIdAsync(id) == null)
170166
{
171167
return TypedResults.NotFound();
172168
}
173169

174-
await _playerService.UpdateAsync(player);
170+
await playerService.UpdateAsync(player);
175171

176172
return TypedResults.NoContent();
177173
}
@@ -191,13 +187,13 @@ public async Task<IResult> PutAsync([FromRoute] long id, [FromBody] PlayerReques
191187
[ProducesResponseType(StatusCodes.Status404NotFound)]
192188
public async Task<IResult> DeleteAsync([FromRoute] long id)
193189
{
194-
if (await _playerService.RetrieveByIdAsync(id) == null)
190+
if (await playerService.RetrieveByIdAsync(id) == null)
195191
{
196192
return TypedResults.NotFound();
197193
}
198194
else
199195
{
200-
await _playerService.DeleteAsync(id);
196+
await playerService.DeleteAsync(id);
201197

202198
return TypedResults.NoContent();
203199
}

src/Dotnet.Samples.AspNetCore.WebApi/Data/Repository.cs

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,15 @@
22

33
namespace Dotnet.Samples.AspNetCore.WebApi.Data;
44

5-
public class Repository<T> : IRepository<T>
5+
public class Repository<T>(DbContext dbContext) : IRepository<T>
66
where T : class
77
{
8-
protected readonly DbContext _dbContext;
9-
protected readonly DbSet<T> _dbSet;
10-
11-
public Repository(DbContext dbContext)
12-
{
13-
_dbContext = dbContext;
14-
_dbSet = _dbContext.Set<T>();
15-
}
8+
protected readonly DbSet<T> _dbSet = dbContext.Set<T>();
169

1710
public async Task AddAsync(T entity)
1811
{
1912
await _dbSet.AddAsync(entity);
20-
await _dbContext.SaveChangesAsync();
13+
await dbContext.SaveChangesAsync();
2114
}
2215

2316
public async Task<List<T>> GetAllAsync() => await _dbSet.AsNoTracking().ToListAsync();
@@ -27,7 +20,7 @@ public async Task AddAsync(T entity)
2720
public async Task UpdateAsync(T entity)
2821
{
2922
_dbSet.Update(entity);
30-
await _dbContext.SaveChangesAsync();
23+
await dbContext.SaveChangesAsync();
3124
}
3225

3326
public async Task RemoveAsync(long id)
@@ -36,7 +29,7 @@ public async Task RemoveAsync(long id)
3629
if (entity != null)
3730
{
3831
_dbSet.Remove(entity);
39-
await _dbContext.SaveChangesAsync();
32+
await dbContext.SaveChangesAsync();
4033
}
4134
}
4235
}

src/Dotnet.Samples.AspNetCore.WebApi/Services/PlayerService.cs

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,18 @@ IMapper mapper
1616
private static readonly string AspNetCore_Environment = "ASPNETCORE_ENVIRONMENT";
1717
private static readonly string Development = "Development";
1818

19-
private readonly IPlayerRepository _playerRepository = playerRepository;
20-
private readonly ILogger<PlayerService> _logger = logger;
21-
private readonly IMemoryCache _memoryCache = memoryCache;
22-
private readonly IMapper _mapper = mapper;
23-
2419
/* -------------------------------------------------------------------------
2520
* Create
2621
* ---------------------------------------------------------------------- */
2722

2823
public async Task<PlayerResponseModel> CreateAsync(PlayerRequestModel playerRequestModel)
2924
{
30-
var player = _mapper.Map<Player>(playerRequestModel);
31-
await _playerRepository.AddAsync(player);
32-
_logger.LogInformation("Player added to Repository: {Player}", player);
33-
_memoryCache.Remove(CacheKey_RetrieveAsync);
34-
_logger.LogInformation(
35-
"Removed objects from Cache with Key: {Key}",
36-
CacheKey_RetrieveAsync
37-
);
38-
return _mapper.Map<PlayerResponseModel>(player);
25+
var player = mapper.Map<Player>(playerRequestModel);
26+
await playerRepository.AddAsync(player);
27+
logger.LogInformation("Player added to Repository: {Player}", player);
28+
memoryCache.Remove(CacheKey_RetrieveAsync);
29+
logger.LogInformation("Removed objects from Cache with Key: {Key}", CacheKey_RetrieveAsync);
30+
return mapper.Map<PlayerResponseModel>(player);
3931
}
4032

4133
/* -------------------------------------------------------------------------
@@ -44,9 +36,9 @@ public async Task<PlayerResponseModel> CreateAsync(PlayerRequestModel playerRequ
4436

4537
public async Task<List<PlayerResponseModel>> RetrieveAsync()
4638
{
47-
if (_memoryCache.TryGetValue(CacheKey_RetrieveAsync, out List<PlayerResponseModel>? cached))
39+
if (memoryCache.TryGetValue(CacheKey_RetrieveAsync, out List<PlayerResponseModel>? cached))
4840
{
49-
_logger.LogInformation("Players retrieved from Cache");
41+
logger.LogInformation("Players retrieved from Cache");
5042
return cached!;
5143
}
5244
else
@@ -58,12 +50,12 @@ public async Task<List<PlayerResponseModel>> RetrieveAsync()
5850
await SimulateRepositoryDelayAsync();
5951
}
6052

61-
var players = await _playerRepository.GetAllAsync();
62-
_logger.LogInformation("Players retrieved from Repository");
63-
var playerResponseModels = _mapper.Map<List<PlayerResponseModel>>(players);
64-
using (var cacheEntry = _memoryCache.CreateEntry(CacheKey_RetrieveAsync))
53+
var players = await playerRepository.GetAllAsync();
54+
logger.LogInformation("Players retrieved from Repository");
55+
var playerResponseModels = mapper.Map<List<PlayerResponseModel>>(players);
56+
using (var cacheEntry = memoryCache.CreateEntry(CacheKey_RetrieveAsync))
6557
{
66-
_logger.LogInformation(
58+
logger.LogInformation(
6759
"{Count} entries created in Cache with key: {Key}",
6860
playerResponseModels.Count,
6961
CacheKey_RetrieveAsync
@@ -78,14 +70,14 @@ public async Task<List<PlayerResponseModel>> RetrieveAsync()
7870

7971
public async Task<PlayerResponseModel?> RetrieveByIdAsync(long id)
8072
{
81-
var player = await _playerRepository.FindByIdAsync(id);
82-
return player is not null ? _mapper.Map<PlayerResponseModel>(player) : null;
73+
var player = await playerRepository.FindByIdAsync(id);
74+
return player is not null ? mapper.Map<PlayerResponseModel>(player) : null;
8375
}
8476

8577
public async Task<PlayerResponseModel?> RetrieveBySquadNumberAsync(int squadNumber)
8678
{
87-
var player = await _playerRepository.FindBySquadNumberAsync(squadNumber);
88-
return player is not null ? _mapper.Map<PlayerResponseModel>(player) : null;
79+
var player = await playerRepository.FindBySquadNumberAsync(squadNumber);
80+
return player is not null ? mapper.Map<PlayerResponseModel>(player) : null;
8981
}
9082

9183
/* -------------------------------------------------------------------------
@@ -94,13 +86,13 @@ public async Task<List<PlayerResponseModel>> RetrieveAsync()
9486

9587
public async Task UpdateAsync(PlayerRequestModel playerRequestModel)
9688
{
97-
if (await _playerRepository.FindByIdAsync(playerRequestModel.Id) is Player player)
89+
if (await playerRepository.FindByIdAsync(playerRequestModel.Id) is Player player)
9890
{
99-
_mapper.Map(playerRequestModel, player);
100-
await _playerRepository.UpdateAsync(player);
101-
_logger.LogInformation("Player updated in Repository: {Player}", player);
102-
_memoryCache.Remove(CacheKey_RetrieveAsync);
103-
_logger.LogInformation(
91+
mapper.Map(playerRequestModel, player);
92+
await playerRepository.UpdateAsync(player);
93+
logger.LogInformation("Player updated in Repository: {Player}", player);
94+
memoryCache.Remove(CacheKey_RetrieveAsync);
95+
logger.LogInformation(
10496
"Removed objects from Cache with Key: {Key}",
10597
CacheKey_RetrieveAsync
10698
);
@@ -113,12 +105,12 @@ public async Task UpdateAsync(PlayerRequestModel playerRequestModel)
113105

114106
public async Task DeleteAsync(long id)
115107
{
116-
if (await _playerRepository.FindByIdAsync(id) is not null)
108+
if (await playerRepository.FindByIdAsync(id) is not null)
117109
{
118-
await _playerRepository.RemoveAsync(id);
119-
_logger.LogInformation("Player with Id {Id} removed from Repository", id);
120-
_memoryCache.Remove(CacheKey_RetrieveAsync);
121-
_logger.LogInformation(
110+
await playerRepository.RemoveAsync(id);
111+
logger.LogInformation("Player with Id {Id} removed from Repository", id);
112+
memoryCache.Remove(CacheKey_RetrieveAsync);
113+
logger.LogInformation(
122114
"Removed objects from Cache with Key: {Key}",
123115
CacheKey_RetrieveAsync
124116
);
@@ -147,7 +139,7 @@ private static MemoryCacheEntryOptions GetMemoryCacheEntryOptions()
147139
private async Task SimulateRepositoryDelayAsync()
148140
{
149141
var milliseconds = new Random().Next(2600, 4200);
150-
_logger.LogInformation(
142+
logger.LogInformation(
151143
"Simulating a random delay of {Milliseconds} milliseconds...",
152144
milliseconds
153145
);

0 commit comments

Comments
 (0)