From 4878101106e8699d7720228cb6286129fc21cac6 Mon Sep 17 00:00:00 2001 From: Bill Wagner Date: Tue, 21 Mar 2017 14:25:49 -0400 Subject: [PATCH] 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() --- .../Basket/Basket.API/Controllers/BasketController.cs | 9 ++++----- .../Basket/Basket.API/Controllers/HomeController.cs | 6 ++---- .../ProductPriceChangedIntegrationEventHandler.cs | 5 +++-- .../Events/ProductPriceChangedIntegrationEvent.cs | 6 +++--- src/Services/Basket/Basket.API/Model/Basket.cs | 7 ++----- .../Basket/Basket.API/Model/RedisBasketRepository.cs | 9 ++------- src/Services/Basket/Basket.API/Startup.cs | 2 +- 7 files changed, 17 insertions(+), 27 deletions(-) diff --git a/src/Services/Basket/Basket.API/Controllers/BasketController.cs b/src/Services/Basket/Basket.API/Controllers/BasketController.cs index 5bf23509c..0e64f02ed 100644 --- a/src/Services/Basket/Basket.API/Controllers/BasketController.cs +++ b/src/Services/Basket/Basket.API/Controllers/BasketController.cs @@ -18,10 +18,9 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Controllers { private IBasketRepository _repository; - public BasketController(IBasketRepository repository) - { + public BasketController(IBasketRepository repository) => _repository = repository; - } + // GET api/values/5 [HttpGet("{id}")] public async Task Get(string id) @@ -42,9 +41,9 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Controllers // DELETE api/values/5 [HttpDelete("{id}")] - public void Delete(string id) + public Task Delete(string id) { - _repository.DeleteBasketAsync(id); + return _repository.DeleteBasket(id); } } } diff --git a/src/Services/Basket/Basket.API/Controllers/HomeController.cs b/src/Services/Basket/Basket.API/Controllers/HomeController.cs index 5cf7ab855..f1c054adf 100644 --- a/src/Services/Basket/Basket.API/Controllers/HomeController.cs +++ b/src/Services/Basket/Basket.API/Controllers/HomeController.cs @@ -11,9 +11,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Controllers public class HomeController : Controller { // GET: // - public IActionResult Index() - { - return new RedirectResult("~/swagger/ui"); - } + public IActionResult Index() => + new RedirectResult("~/swagger/ui"); } } diff --git a/src/Services/Basket/Basket.API/IntegrationEvents/EventHandling/ProductPriceChangedIntegrationEventHandler.cs b/src/Services/Basket/Basket.API/IntegrationEvents/EventHandling/ProductPriceChangedIntegrationEventHandler.cs index 88244404a..a8e87ad4e 100644 --- a/src/Services/Basket/Basket.API/IntegrationEvents/EventHandling/ProductPriceChangedIntegrationEventHandler.cs +++ b/src/Services/Basket/Basket.API/IntegrationEvents/EventHandling/ProductPriceChangedIntegrationEventHandler.cs @@ -5,6 +5,7 @@ using System; using System.Linq; using System.Threading.Tasks; + namespace Microsoft.eShopOnContainers.Services.Basket.API.IntegrationEvents.EventHandling { public class ProductPriceChangedIntegrationEventHandler : IIntegrationEventHandler @@ -16,7 +17,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.IntegrationEvents.Even _repository = repository ?? throw new ArgumentNullException(nameof(repository)); } - public async Task Handle(ProductPriceChangedIntegrationEvent @event) + public async Task Handle(ProductPriceChangedIntegrationEvent @event) { 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(); - if (itemsToUpdate != null) + if ((itemsToUpdate != null) && (itemsToUpdate.Any()) { foreach (var item in itemsToUpdate) { diff --git a/src/Services/Basket/Basket.API/IntegrationEvents/Events/ProductPriceChangedIntegrationEvent.cs b/src/Services/Basket/Basket.API/IntegrationEvents/Events/ProductPriceChangedIntegrationEvent.cs index 6f51010be..6ac83f155 100644 --- a/src/Services/Basket/Basket.API/IntegrationEvents/Events/ProductPriceChangedIntegrationEvent.cs +++ b/src/Services/Basket/Basket.API/IntegrationEvents/Events/ProductPriceChangedIntegrationEvent.cs @@ -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. 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) { diff --git a/src/Services/Basket/Basket.API/Model/Basket.cs b/src/Services/Basket/Basket.API/Model/Basket.cs index d07c710e7..e5b0910f7 100644 --- a/src/Services/Basket/Basket.API/Model/Basket.cs +++ b/src/Services/Basket/Basket.API/Model/Basket.cs @@ -8,12 +8,9 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Model public class CustomerBasket { public string BuyerId { get; set; } - public List Items { get; set; } + public List Items { get; set; } = new List(); - public CustomerBasket(string customerId) - { + public CustomerBasket(string customerId) => BuyerId = customerId; - Items = new List(); - } } } diff --git a/src/Services/Basket/Basket.API/Model/RedisBasketRepository.cs b/src/Services/Basket/Basket.API/Model/RedisBasketRepository.cs index 01a8b4728..f245ac7ce 100644 --- a/src/Services/Basket/Basket.API/Model/RedisBasketRepository.cs +++ b/src/Services/Basket/Basket.API/Model/RedisBasketRepository.cs @@ -27,7 +27,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Model public async Task DeleteBasketAsync(string id) { var database = await GetDatabase(); - return await database.KeyDeleteAsync(id.ToString()); + return await database.KeyDeleteAsync(id); } public async Task> GetUsersAsync() @@ -35,11 +35,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Model var server = await GetServer(); IEnumerable data = server.Keys(); - if (data == null) - { - return null; - } - return data.Select(k => k.ToString()); + return data?.Select(k => k.ToString()); } public async Task GetBasketAsync(string customerId) @@ -108,7 +104,6 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Model _redis = await ConnectionMultiplexer.ConnectAsync(ips.First().ToString()); } } - } } diff --git a/src/Services/Basket/Basket.API/Startup.cs b/src/Services/Basket/Basket.API/Startup.cs index 855312a65..2fdd31fd7 100644 --- a/src/Services/Basket/Basket.API/Startup.cs +++ b/src/Services/Basket/Basket.API/Startup.cs @@ -148,7 +148,7 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API var identityUrl = Configuration.GetValue("IdentityUrl"); app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions { - Authority = identityUrl.ToString(), + Authority = identityUrl, ScopeName = "basket", RequireHttpsMetadata = false });