From bee167b87865b3381209993af4e2966070cdbf69 Mon Sep 17 00:00:00 2001 From: Maurits Moeys Date: Wed, 23 Oct 2019 11:10:53 +0200 Subject: [PATCH 1/3] refactor: simplify resource service constructor with IEnumerable --- .../Services/CustomArticleService.cs | 14 +++------ .../Services/DefaultResourceService.cs | 30 ++++++++----------- .../Services/EntityResourceService_Tests.cs | 2 +- 3 files changed, 18 insertions(+), 28 deletions(-) diff --git a/src/Examples/JsonApiDotNetCoreExample/Services/CustomArticleService.cs b/src/Examples/JsonApiDotNetCoreExample/Services/CustomArticleService.cs index 549feaaa66..d34f32756d 100644 --- a/src/Examples/JsonApiDotNetCoreExample/Services/CustomArticleService.cs +++ b/src/Examples/JsonApiDotNetCoreExample/Services/CustomArticleService.cs @@ -7,26 +7,20 @@ using JsonApiDotNetCore.Services; using JsonApiDotNetCoreExample.Models; using Microsoft.Extensions.Logging; +using System.Collections.Generic; using System.Threading.Tasks; namespace JsonApiDotNetCoreExample.Services { public class CustomArticleService : DefaultResourceService
{ - public CustomArticleService(ISortService sortService, - IFilterService filterService, - IResourceRepository repository, + public CustomArticleService(IEnumerable queryParameters, IJsonApiOptions options, - IIncludeService includeService, - ISparseFieldsService sparseFieldsService, - IPageService pageService, + IResourceRepository repository, IResourceContextProvider provider, IResourceHookExecutor hookExecutor = null, ILoggerFactory loggerFactory = null) - : base(sortService, filterService, repository, options, includeService, sparseFieldsService, - pageService, provider, hookExecutor, loggerFactory) - { - } + : base(queryParameters, options, repository, provider, hookExecutor, loggerFactory) { } public override async Task
GetAsync(int id) { diff --git a/src/JsonApiDotNetCore/Services/DefaultResourceService.cs b/src/JsonApiDotNetCore/Services/DefaultResourceService.cs index bb68d08754..1197cdd986 100644 --- a/src/JsonApiDotNetCore/Services/DefaultResourceService.cs +++ b/src/JsonApiDotNetCore/Services/DefaultResourceService.cs @@ -34,23 +34,19 @@ public class DefaultResourceService : private readonly ResourceContext _currentRequestResource; public DefaultResourceService( - ISortService sortService, - IFilterService filterService, + IEnumerable queryParameters, IJsonApiOptions options, - IIncludeService includeService, - ISparseFieldsService sparseFieldsService, - IPageService pageManager, IResourceRepository repository, IResourceContextProvider provider, IResourceHookExecutor hookExecutor = null, ILoggerFactory loggerFactory = null) { - _includeService = includeService; - _sparseFieldsService = sparseFieldsService; - _pageManager = pageManager; + _includeService = queryParameters.FirstOrDefault(qp => qp is IIncludeService) as IIncludeService; + _sparseFieldsService = queryParameters.FirstOrDefault(qp => qp is ISparseFieldsService) as ISparseFieldsService; + _pageManager = queryParameters.FirstOrDefault(qp => qp is IPageService) as IPageService; + _sortService = queryParameters.FirstOrDefault(qp => qp is ISortService) as ISortService; + _filterService = queryParameters.FirstOrDefault(qp => qp is IFilterService) as IFilterService; _options = options; - _sortService = sortService; - _filterService = filterService; _repository = repository; _hookExecutor = hookExecutor; _logger = loggerFactory?.CreateLogger>(); @@ -323,12 +319,12 @@ public class DefaultResourceService : DefaultResourceService where TResource : class, IIdentifiable { - public DefaultResourceService(ISortService sortService, IFilterService filterService, IResourceRepository repository, - IJsonApiOptions options, IIncludeService includeService, ISparseFieldsService sparseFieldsService, - IPageService pageManager, IResourceContextProvider provider, - IResourceHookExecutor hookExecutor = null, ILoggerFactory loggerFactory = null) - : base(sortService, filterService, options, includeService, sparseFieldsService, pageManager, repository, provider, hookExecutor, loggerFactory) - { - } + public DefaultResourceService(IEnumerable queryParameters, + IJsonApiOptions options, + IResourceRepository repository, + IResourceContextProvider provider, + IResourceHookExecutor hookExecutor = null, + ILoggerFactory loggerFactory = null) + : base(queryParameters, options, repository, provider, hookExecutor, loggerFactory) { } } } diff --git a/test/UnitTests/Services/EntityResourceService_Tests.cs b/test/UnitTests/Services/EntityResourceService_Tests.cs index 169bb66179..3451dd955a 100644 --- a/test/UnitTests/Services/EntityResourceService_Tests.cs +++ b/test/UnitTests/Services/EntityResourceService_Tests.cs @@ -97,7 +97,7 @@ public async Task GetRelationshipAsync_Returns_Relationship_Value() private DefaultResourceService GetService() { - return new DefaultResourceService(null, null, _repositoryMock.Object, new JsonApiOptions(), null, null, _pgsMock.Object, _resourceGraph); + return new DefaultResourceService(new List(), new JsonApiOptions(), _repositoryMock.Object, _resourceGraph); } } } From 01ac2df8337f5cddca0565bbdbadc04efde252b5 Mon Sep 17 00:00:00 2001 From: Maurits Moeys Date: Wed, 23 Oct 2019 13:08:20 +0200 Subject: [PATCH 2/3] feat: FirstOrDefault() extension method --- .../Extensions/IEnumerableExtensions.cs | 18 ++++++++++++++++++ .../Extensions/IQueryableExtensions.cs | 1 + .../Services/DefaultResourceService.cs | 12 +++++++----- 3 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 src/JsonApiDotNetCore/Extensions/IEnumerableExtensions.cs diff --git a/src/JsonApiDotNetCore/Extensions/IEnumerableExtensions.cs b/src/JsonApiDotNetCore/Extensions/IEnumerableExtensions.cs new file mode 100644 index 0000000000..b0748f3eeb --- /dev/null +++ b/src/JsonApiDotNetCore/Extensions/IEnumerableExtensions.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using System.Linq; +using JsonApiDotNetCore.Query; + +namespace JsonApiDotNetCore.Extensions +{ + public static class IEnumerableExtensions + { + /// + /// gets the first element of type if it exists and casts the result to that. + /// Returns null otherwise. + /// + public static TImplementedService FirstOrDefault(this IEnumerable data) where TImplementedService : class, IQueryParameterService + { + return data.FirstOrDefault(qp => qp is TImplementedService) as TImplementedService; + } + } +} diff --git a/src/JsonApiDotNetCore/Extensions/IQueryableExtensions.cs b/src/JsonApiDotNetCore/Extensions/IQueryableExtensions.cs index 49f6dfc326..65a65677e6 100644 --- a/src/JsonApiDotNetCore/Extensions/IQueryableExtensions.cs +++ b/src/JsonApiDotNetCore/Extensions/IQueryableExtensions.cs @@ -10,6 +10,7 @@ namespace JsonApiDotNetCore.Extensions { + // ReSharper disable once InconsistentNaming public static class IQueryableExtensions { diff --git a/src/JsonApiDotNetCore/Services/DefaultResourceService.cs b/src/JsonApiDotNetCore/Services/DefaultResourceService.cs index 1197cdd986..116fa009f8 100644 --- a/src/JsonApiDotNetCore/Services/DefaultResourceService.cs +++ b/src/JsonApiDotNetCore/Services/DefaultResourceService.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using JsonApiDotNetCore.Internal.Contracts; using JsonApiDotNetCore.Query; +using JsonApiDotNetCore.Extensions; namespace JsonApiDotNetCore.Services { @@ -41,11 +42,11 @@ public DefaultResourceService( IResourceHookExecutor hookExecutor = null, ILoggerFactory loggerFactory = null) { - _includeService = queryParameters.FirstOrDefault(qp => qp is IIncludeService) as IIncludeService; - _sparseFieldsService = queryParameters.FirstOrDefault(qp => qp is ISparseFieldsService) as ISparseFieldsService; - _pageManager = queryParameters.FirstOrDefault(qp => qp is IPageService) as IPageService; - _sortService = queryParameters.FirstOrDefault(qp => qp is ISortService) as ISortService; - _filterService = queryParameters.FirstOrDefault(qp => qp is IFilterService) as IFilterService; + _includeService = queryParameters.FirstOrDefault(); + _sparseFieldsService = queryParameters.FirstOrDefault(); + _pageManager = queryParameters.FirstOrDefault(); + _sortService = queryParameters.FirstOrDefault(); + _filterService = queryParameters.FirstOrDefault(); _options = options; _repository = repository; _hookExecutor = hookExecutor; @@ -53,6 +54,7 @@ public DefaultResourceService( _currentRequestResource = provider.GetResourceContext(); } + public virtual async Task CreateAsync(TResource entity) { entity = IsNull(_hookExecutor) ? entity : _hookExecutor.BeforeCreate(AsList(entity), ResourcePipeline.Post).SingleOrDefault(); From cfd7886c173b1265c9e2a4d19b59738112504d6c Mon Sep 17 00:00:00 2001 From: Maurits Moeys Date: Wed, 23 Oct 2019 13:10:36 +0200 Subject: [PATCH 3/3] style: remove whitespace --- src/JsonApiDotNetCore/Extensions/IQueryableExtensions.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/JsonApiDotNetCore/Extensions/IQueryableExtensions.cs b/src/JsonApiDotNetCore/Extensions/IQueryableExtensions.cs index 65a65677e6..49f6dfc326 100644 --- a/src/JsonApiDotNetCore/Extensions/IQueryableExtensions.cs +++ b/src/JsonApiDotNetCore/Extensions/IQueryableExtensions.cs @@ -10,7 +10,6 @@ namespace JsonApiDotNetCore.Extensions { - // ReSharper disable once InconsistentNaming public static class IQueryableExtensions {