Skip to content

Commit d0e9cc5

Browse files
Merge pull request dotnet-architecture#311 from egorikas/dev
Fix "DRY up RedisBasketRepository"
2 parents fa6d509 + 62ea706 commit d0e9cc5

4 files changed

Lines changed: 21 additions & 54 deletions

File tree

src/Services/Basket/Basket.API/IntegrationEvents/EventHandling/ProductPriceChangedIntegrationEventHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public ProductPriceChangedIntegrationEventHandler(IBasketRepository repository)
1818

1919
public async Task Handle(ProductPriceChangedIntegrationEvent @event)
2020
{
21-
var userIds = await _repository.GetUsersAsync();
21+
var userIds = _repository.GetUsers();
2222

2323
foreach (var id in userIds)
2424
{

src/Services/Basket/Basket.API/Model/IBasketRepository.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Model
66
public interface IBasketRepository
77
{
88
Task<CustomerBasket> GetBasketAsync(string customerId);
9-
Task<IEnumerable<string>> GetUsersAsync();
9+
IEnumerable<string> GetUsers();
1010
Task<CustomerBasket> UpdateBasketAsync(CustomerBasket basket);
1111
Task<bool> DeleteBasketAsync(string id);
1212
}
Lines changed: 14 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using Microsoft.Extensions.Logging;
2-
using Microsoft.Extensions.Options;
32
using Newtonsoft.Json;
43
using StackExchange.Redis;
54
using System.Collections.Generic;
@@ -10,40 +9,33 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Model
109
{
1110
public class RedisBasketRepository : IBasketRepository
1211
{
13-
private ILogger<RedisBasketRepository> _logger;
14-
private BasketSettings _settings;
12+
private readonly ILogger<RedisBasketRepository> _logger;
1513

16-
private ConnectionMultiplexer _redis;
14+
private readonly ConnectionMultiplexer _redis;
15+
private readonly IDatabase _database;
1716

18-
public RedisBasketRepository(IOptionsSnapshot<BasketSettings> options, ILoggerFactory loggerFactory)
17+
public RedisBasketRepository(ILoggerFactory loggerFactory, ConnectionMultiplexer redis)
1918
{
20-
_settings = options.Value;
2119
_logger = loggerFactory.CreateLogger<RedisBasketRepository>();
20+
_redis = redis;
21+
_database = redis.GetDatabase();
2222
}
2323

2424
public async Task<bool> DeleteBasketAsync(string id)
2525
{
26-
var database = await GetDatabase();
27-
return await database.KeyDeleteAsync(id.ToString());
26+
return await _database.KeyDeleteAsync(id);
2827
}
2928

30-
public async Task<IEnumerable<string>> GetUsersAsync()
29+
public IEnumerable<string> GetUsers()
3130
{
32-
var server = await GetServer();
33-
34-
IEnumerable<RedisKey> data = server.Keys();
35-
if (data == null)
36-
{
37-
return null;
38-
}
39-
return data.Select(k => k.ToString());
31+
var server = GetServer();
32+
var data = server.Keys();
33+
return data?.Select(k => k.ToString());
4034
}
4135

4236
public async Task<CustomerBasket> GetBasketAsync(string customerId)
4337
{
44-
var database = await GetDatabase();
45-
46-
var data = await database.StringGetAsync(customerId.ToString());
38+
var data = await _database.StringGetAsync(customerId);
4739
if (data.IsNullOrEmpty)
4840
{
4941
return null;
@@ -54,9 +46,7 @@ public async Task<CustomerBasket> GetBasketAsync(string customerId)
5446

5547
public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket basket)
5648
{
57-
var database = await GetDatabase();
58-
59-
var created = await database.StringSetAsync(basket.BuyerId, JsonConvert.SerializeObject(basket));
49+
var created = await _database.StringSetAsync(basket.BuyerId, JsonConvert.SerializeObject(basket));
6050
if (!created)
6151
{
6252
_logger.LogInformation("Problem occur persisting the item.");
@@ -68,34 +58,10 @@ public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket basket)
6858
return await GetBasketAsync(basket.BuyerId);
6959
}
7060

71-
private async Task<IDatabase> GetDatabase()
72-
{
73-
if (_redis == null)
74-
{
75-
await ConnectToRedisAsync();
76-
}
77-
78-
return _redis.GetDatabase();
79-
}
80-
81-
private async Task<IServer> GetServer()
61+
private IServer GetServer()
8262
{
83-
if (_redis == null)
84-
{
85-
await ConnectToRedisAsync();
86-
}
8763
var endpoint = _redis.GetEndPoints();
88-
8964
return _redis.GetServer(endpoint.First());
9065
}
91-
92-
private async Task ConnectToRedisAsync()
93-
{
94-
var configuration = ConfigurationOptions.Parse(_settings.ConnectionString, true);
95-
configuration.ResolveDns = true;
96-
97-
_logger.LogInformation($"Connecting to database {configuration.SslHost}.");
98-
_redis = await ConnectionMultiplexer.ConnectAsync(configuration);
99-
}
10066
}
10167
}

test/Services/IntegrationTests/Services/Basket/RedisBasketRepositoryTests.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11

2+
using StackExchange.Redis;
3+
24
namespace IntegrationTests.Services.Basket
35
{
46
using Microsoft.eShopOnContainers.Services.Basket.API;
@@ -57,10 +59,9 @@ public async Task Delete_Basket_return_null()
5759
RedisBasketRepository BuildBasketRepository()
5860
{
5961
var loggerFactory = new LoggerFactory();
60-
var basketSettings = new BasketSettings() { ConnectionString = "127.0.0.1" };
61-
_optionsMock.Setup(x => x.Value).Returns(basketSettings);
62-
63-
return new RedisBasketRepository(_optionsMock.Object, loggerFactory);
62+
var configuration = ConfigurationOptions.Parse("127.0.0.1", true);
63+
configuration.ResolveDns = true;
64+
return new RedisBasketRepository(loggerFactory, ConnectionMultiplexer.Connect(configuration));
6465
}
6566

6667
List<BasketItem> BuildBasketItems()

0 commit comments

Comments
 (0)