Merge pull request #311 from egorikas/dev

Fix "DRY up RedisBasketRepository"
This commit is contained in:
RamonTC 2017-10-13 16:41:37 +02:00 committed by GitHub
commit d0e9cc58a9
4 changed files with 21 additions and 54 deletions

View File

@ -18,7 +18,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.IntegrationEvents.Even
public async Task Handle(ProductPriceChangedIntegrationEvent @event) public async Task Handle(ProductPriceChangedIntegrationEvent @event)
{ {
var userIds = await _repository.GetUsersAsync(); var userIds = _repository.GetUsers();
foreach (var id in userIds) foreach (var id in userIds)
{ {

View File

@ -6,7 +6,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Model
public interface IBasketRepository public interface IBasketRepository
{ {
Task<CustomerBasket> GetBasketAsync(string customerId); Task<CustomerBasket> GetBasketAsync(string customerId);
Task<IEnumerable<string>> GetUsersAsync(); IEnumerable<string> GetUsers();
Task<CustomerBasket> UpdateBasketAsync(CustomerBasket basket); Task<CustomerBasket> UpdateBasketAsync(CustomerBasket basket);
Task<bool> DeleteBasketAsync(string id); Task<bool> DeleteBasketAsync(string id);
} }

View File

@ -1,5 +1,4 @@
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Newtonsoft.Json; using Newtonsoft.Json;
using StackExchange.Redis; using StackExchange.Redis;
using System.Collections.Generic; using System.Collections.Generic;
@ -10,40 +9,33 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Model
{ {
public class RedisBasketRepository : IBasketRepository public class RedisBasketRepository : IBasketRepository
{ {
private ILogger<RedisBasketRepository> _logger; private readonly ILogger<RedisBasketRepository> _logger;
private BasketSettings _settings;
private ConnectionMultiplexer _redis; private readonly ConnectionMultiplexer _redis;
private readonly IDatabase _database;
public RedisBasketRepository(IOptionsSnapshot<BasketSettings> options, ILoggerFactory loggerFactory) public RedisBasketRepository(ILoggerFactory loggerFactory, ConnectionMultiplexer redis)
{ {
_settings = options.Value;
_logger = loggerFactory.CreateLogger<RedisBasketRepository>(); _logger = loggerFactory.CreateLogger<RedisBasketRepository>();
_redis = redis;
_database = redis.GetDatabase();
} }
public async Task<bool> DeleteBasketAsync(string id) public async Task<bool> DeleteBasketAsync(string id)
{ {
var database = await GetDatabase(); return await _database.KeyDeleteAsync(id);
return await database.KeyDeleteAsync(id.ToString());
} }
public async Task<IEnumerable<string>> GetUsersAsync() public IEnumerable<string> GetUsers()
{ {
var server = await GetServer(); var server = GetServer();
var data = server.Keys();
IEnumerable<RedisKey> data = server.Keys(); return data?.Select(k => k.ToString());
if (data == null)
{
return null;
}
return data.Select(k => k.ToString());
} }
public async Task<CustomerBasket> GetBasketAsync(string customerId) public async Task<CustomerBasket> GetBasketAsync(string customerId)
{ {
var database = await GetDatabase(); var data = await _database.StringGetAsync(customerId);
var data = await database.StringGetAsync(customerId.ToString());
if (data.IsNullOrEmpty) if (data.IsNullOrEmpty)
{ {
return null; return null;
@ -54,9 +46,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Model
public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket basket) public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket basket)
{ {
var database = await GetDatabase(); var created = await _database.StringSetAsync(basket.BuyerId, JsonConvert.SerializeObject(basket));
var created = await database.StringSetAsync(basket.BuyerId, JsonConvert.SerializeObject(basket));
if (!created) if (!created)
{ {
_logger.LogInformation("Problem occur persisting the item."); _logger.LogInformation("Problem occur persisting the item.");
@ -68,34 +58,10 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Model
return await GetBasketAsync(basket.BuyerId); return await GetBasketAsync(basket.BuyerId);
} }
private async Task<IDatabase> GetDatabase() private IServer GetServer()
{ {
if (_redis == null)
{
await ConnectToRedisAsync();
}
return _redis.GetDatabase();
}
private async Task<IServer> GetServer()
{
if (_redis == null)
{
await ConnectToRedisAsync();
}
var endpoint = _redis.GetEndPoints(); var endpoint = _redis.GetEndPoints();
return _redis.GetServer(endpoint.First()); return _redis.GetServer(endpoint.First());
} }
private async Task ConnectToRedisAsync()
{
var configuration = ConfigurationOptions.Parse(_settings.ConnectionString, true);
configuration.ResolveDns = true;
_logger.LogInformation($"Connecting to database {configuration.SslHost}.");
_redis = await ConnectionMultiplexer.ConnectAsync(configuration);
}
} }
} }

View File

@ -1,4 +1,6 @@
 
using StackExchange.Redis;
namespace IntegrationTests.Services.Basket namespace IntegrationTests.Services.Basket
{ {
using Microsoft.eShopOnContainers.Services.Basket.API; using Microsoft.eShopOnContainers.Services.Basket.API;
@ -57,10 +59,9 @@ namespace IntegrationTests.Services.Basket
RedisBasketRepository BuildBasketRepository() RedisBasketRepository BuildBasketRepository()
{ {
var loggerFactory = new LoggerFactory(); var loggerFactory = new LoggerFactory();
var basketSettings = new BasketSettings() { ConnectionString = "127.0.0.1" }; var configuration = ConfigurationOptions.Parse("127.0.0.1", true);
_optionsMock.Setup(x => x.Value).Returns(basketSettings); configuration.ResolveDns = true;
return new RedisBasketRepository(loggerFactory, ConnectionMultiplexer.Connect(configuration));
return new RedisBasketRepository(_optionsMock.Object, loggerFactory);
} }
List<BasketItem> BuildBasketItems() List<BasketItem> BuildBasketItems()