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/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/Services/DefaultResourceService.cs b/src/JsonApiDotNetCore/Services/DefaultResourceService.cs index bb68d08754..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 { @@ -34,29 +35,26 @@ 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(); + _sparseFieldsService = queryParameters.FirstOrDefault(); + _pageManager = queryParameters.FirstOrDefault(); + _sortService = queryParameters.FirstOrDefault(); + _filterService = queryParameters.FirstOrDefault(); _options = options; - _sortService = sortService; - _filterService = filterService; _repository = repository; _hookExecutor = hookExecutor; _logger = loggerFactory?.CreateLogger>(); _currentRequestResource = provider.GetResourceContext(); } + public virtual async Task CreateAsync(TResource entity) { entity = IsNull(_hookExecutor) ? entity : _hookExecutor.BeforeCreate(AsList(entity), ResourcePipeline.Post).SingleOrDefault(); @@ -323,12 +321,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); } } }