Browse Source

Refactor and update to C# 7 constructs

Controllers/BasketController:
Use Expression Bodied Members.
Delete() should not be 'fire and forget'

Controllers/HomeController:
Expression bodied constructor

IntegrationEvents/EventHandling/ProductPriceChangedIntegratedEventHandler:
Use valueTask to minimize allocations for 'fast path' tasks. One might
believe that
most users would not have the changing item in the basket at any given
time.
Using ValueTask instead of Task, this minimizes allocations to only when
async
work must actually take place.

IntegrationEvents/EventHandling/ProductPriceChangedIntegratedEvent:
Make the properties ReadOnly

Model/Basket:
Use property initializer

Model/RedisBasketRepository:
Remove redundant ToString()
Use elvis operator instead of statement null check

Startup:
remove redundant ToString()
pull/128/head
Bill Wagner 7 years ago
parent
commit
4878101106
7 changed files with 17 additions and 27 deletions
  1. +4
    -5
      src/Services/Basket/Basket.API/Controllers/BasketController.cs
  2. +2
    -4
      src/Services/Basket/Basket.API/Controllers/HomeController.cs
  3. +3
    -2
      src/Services/Basket/Basket.API/IntegrationEvents/EventHandling/ProductPriceChangedIntegrationEventHandler.cs
  4. +3
    -3
      src/Services/Basket/Basket.API/IntegrationEvents/Events/ProductPriceChangedIntegrationEvent.cs
  5. +2
    -5
      src/Services/Basket/Basket.API/Model/Basket.cs
  6. +2
    -7
      src/Services/Basket/Basket.API/Model/RedisBasketRepository.cs
  7. +1
    -1
      src/Services/Basket/Basket.API/Startup.cs

+ 4
- 5
src/Services/Basket/Basket.API/Controllers/BasketController.cs View File

@ -18,10 +18,9 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Controllers
{ {
private IBasketRepository _repository; private IBasketRepository _repository;
public BasketController(IBasketRepository repository)
{
public BasketController(IBasketRepository repository) =>
_repository = repository; _repository = repository;
}
// GET api/values/5 // GET api/values/5
[HttpGet("{id}")] [HttpGet("{id}")]
public async Task<IActionResult> Get(string id) public async Task<IActionResult> Get(string id)
@ -42,9 +41,9 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Controllers
// DELETE api/values/5 // DELETE api/values/5
[HttpDelete("{id}")] [HttpDelete("{id}")]
public void Delete(string id)
public Task Delete(string id)
{ {
_repository.DeleteBasketAsync(id);
return _repository.DeleteBasket(id);
} }
} }
} }

+ 2
- 4
src/Services/Basket/Basket.API/Controllers/HomeController.cs View File

@ -11,9 +11,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Controllers
public class HomeController : Controller public class HomeController : Controller
{ {
// GET: /<controller>/ // GET: /<controller>/
public IActionResult Index()
{
return new RedirectResult("~/swagger/ui");
}
public IActionResult Index() =>
new RedirectResult("~/swagger/ui");
} }
} }

+ 3
- 2
src/Services/Basket/Basket.API/IntegrationEvents/EventHandling/ProductPriceChangedIntegrationEventHandler.cs View File

@ -5,6 +5,7 @@ using System;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Microsoft.eShopOnContainers.Services.Basket.API.IntegrationEvents.EventHandling namespace Microsoft.eShopOnContainers.Services.Basket.API.IntegrationEvents.EventHandling
{ {
public class ProductPriceChangedIntegrationEventHandler : IIntegrationEventHandler<ProductPriceChangedIntegrationEvent> public class ProductPriceChangedIntegrationEventHandler : IIntegrationEventHandler<ProductPriceChangedIntegrationEvent>
@ -16,7 +17,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.IntegrationEvents.Even
_repository = repository ?? throw new ArgumentNullException(nameof(repository)); _repository = repository ?? throw new ArgumentNullException(nameof(repository));
} }
public async Task Handle(ProductPriceChangedIntegrationEvent @event)
public async Task Handle(ProductPriceChangedIntegrationEvent @event)
{ {
var userIds = await _repository.GetUsersAsync(); var userIds = await _repository.GetUsersAsync();
@ -32,7 +33,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.IntegrationEvents.Even
{ {
var itemsToUpdate = basket?.Items?.Where(x => int.Parse(x.ProductId) == productId).ToList(); var itemsToUpdate = basket?.Items?.Where(x => int.Parse(x.ProductId) == productId).ToList();
if (itemsToUpdate != null)
if ((itemsToUpdate != null) && (itemsToUpdate.Any())
{ {
foreach (var item in itemsToUpdate) foreach (var item in itemsToUpdate)
{ {


+ 3
- 3
src/Services/Basket/Basket.API/IntegrationEvents/Events/ProductPriceChangedIntegrationEvent.cs View File

@ -7,11 +7,11 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.IntegrationEvents.Even
// An Integration Event is an event that can cause side effects to other microsrvices, Bounded-Contexts or external systems. // An Integration Event is an event that can cause side effects to other microsrvices, Bounded-Contexts or external systems.
public class ProductPriceChangedIntegrationEvent : IntegrationEvent public class ProductPriceChangedIntegrationEvent : IntegrationEvent
{ {
public int ProductId { get; private set; }
public int ProductId { get; }
public decimal NewPrice { get; private set; }
public decimal NewPrice { get; }
public decimal OldPrice { get; private set; }
public decimal OldPrice { get; }
public ProductPriceChangedIntegrationEvent(int productId, decimal newPrice, decimal oldPrice) public ProductPriceChangedIntegrationEvent(int productId, decimal newPrice, decimal oldPrice)
{ {


+ 2
- 5
src/Services/Basket/Basket.API/Model/Basket.cs View File

@ -8,12 +8,9 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Model
public class CustomerBasket public class CustomerBasket
{ {
public string BuyerId { get; set; } public string BuyerId { get; set; }
public List<BasketItem> Items { get; set; }
public List<BasketItem> Items { get; set; } = new List<BasketItem>();
public CustomerBasket(string customerId)
{
public CustomerBasket(string customerId) =>
BuyerId = customerId; BuyerId = customerId;
Items = new List<Model.BasketItem>();
}
} }
} }

+ 2
- 7
src/Services/Basket/Basket.API/Model/RedisBasketRepository.cs View File

@ -27,7 +27,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Model
public async Task<bool> DeleteBasketAsync(string id) public async Task<bool> DeleteBasketAsync(string id)
{ {
var database = await GetDatabase(); var database = await GetDatabase();
return await database.KeyDeleteAsync(id.ToString());
return await database.KeyDeleteAsync(id);
} }
public async Task<IEnumerable<string>> GetUsersAsync() public async Task<IEnumerable<string>> GetUsersAsync()
@ -35,11 +35,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Model
var server = await GetServer(); var server = await GetServer();
IEnumerable<RedisKey> data = server.Keys(); IEnumerable<RedisKey> data = server.Keys();
if (data == null)
{
return null;
}
return data.Select(k => k.ToString());
return data?.Select(k => k.ToString());
} }
public async Task<CustomerBasket> GetBasketAsync(string customerId) public async Task<CustomerBasket> GetBasketAsync(string customerId)
@ -108,7 +104,6 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Model
_redis = await ConnectionMultiplexer.ConnectAsync(ips.First().ToString()); _redis = await ConnectionMultiplexer.ConnectAsync(ips.First().ToString());
} }
} }
} }
} }

+ 1
- 1
src/Services/Basket/Basket.API/Startup.cs View File

@ -148,7 +148,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API
var identityUrl = Configuration.GetValue<string>("IdentityUrl"); var identityUrl = Configuration.GetValue<string>("IdentityUrl");
app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
{ {
Authority = identityUrl.ToString(),
Authority = identityUrl,
ScopeName = "basket", ScopeName = "basket",
RequireHttpsMetadata = false RequireHttpsMetadata = false
}); });


Loading…
Cancel
Save