From 4009f2b68a6209cff4a4ff24c33df8206f9beb66 Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Fri, 21 Aug 2020 11:29:54 +0200 Subject: [PATCH] load generics by scanning registered services first and fallback to assembly discovery --- zero.Core/Api/PagesApi.cs | 1 + zero.Debug/Renderers/page.redirect.js | 13 ++++++++ .../predefined/module-preview-figure.vue | 2 +- zero.Web/ApiControllerFeatureProvider.cs | 31 +++++++++++++++---- zero.Web/ZeroBuilder.cs | 2 +- 5 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 zero.Debug/Renderers/page.redirect.js diff --git a/zero.Core/Api/PagesApi.cs b/zero.Core/Api/PagesApi.cs index 52c7e49f..93611ab6 100644 --- a/zero.Core/Api/PagesApi.cs +++ b/zero.Core/Api/PagesApi.cs @@ -26,6 +26,7 @@ namespace zero.Core.Api /// public async Task GetById(string id) { + var res = await GetById(id); // this works return await GetById(id); } diff --git a/zero.Debug/Renderers/page.redirect.js b/zero.Debug/Renderers/page.redirect.js new file mode 100644 index 00000000..5218fe4a --- /dev/null +++ b/zero.Debug/Renderers/page.redirect.js @@ -0,0 +1,13 @@ + +export default { + alias: 'page.redirect', + + fields: [ + { + field: 'link', + display: 'text', + label: 'Link', + required: true + }, + ] +}; \ No newline at end of file diff --git a/zero.Web.UI/App/components/modules/predefined/module-preview-figure.vue b/zero.Web.UI/App/components/modules/predefined/module-preview-figure.vue index 0c4c8fbc..4402c2a1 100644 --- a/zero.Web.UI/App/components/modules/predefined/module-preview-figure.vue +++ b/zero.Web.UI/App/components/modules/predefined/module-preview-figure.vue @@ -3,7 +3,7 @@
-
+
{{subline.replace(/<\/?[^>]+>/ig, " ")}}
diff --git a/zero.Web/ApiControllerFeatureProvider.cs b/zero.Web/ApiControllerFeatureProvider.cs index 7ae217dc..a1cbaa0f 100644 --- a/zero.Web/ApiControllerFeatureProvider.cs +++ b/zero.Web/ApiControllerFeatureProvider.cs @@ -1,11 +1,13 @@ using Microsoft.AspNetCore.Mvc.ApplicationParts; using Microsoft.AspNetCore.Mvc.Controllers; +using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using zero.Core; using zero.Core.Assemblies; +using zero.Core.Entities; using zero.Web.Controllers; using zero.Web.Filters; @@ -13,14 +15,18 @@ namespace zero.Web { public class ApiControllerFeatureProvider : IApplicationFeatureProvider { - public ApiControllerFeatureProvider() - { + IServiceCollection ServiceCollection; + public ApiControllerFeatureProvider(IServiceCollection serviceCollection) + { + ServiceCollection = serviceCollection; } public void PopulateFeature(IEnumerable parts, ControllerFeature feature) - { + { + var pagetype = typeof(IPage); + var page = ServiceCollection.FirstOrDefault(x => x.ServiceType.Equals(pagetype)); IEnumerable candidates = AssemblyDiscovery.Current.GetTypes(parts, true).Where(x => x.ContainsGenericParameters); foreach (TypeInfo candidate in candidates) @@ -42,12 +48,25 @@ namespace zero.Web break; } - TypeInfo concreteArgument = AssemblyDiscovery.Current.GetTypes(requiredService, parts).FirstOrDefault(); + TypeInfo concreteArgument = null; + + ServiceDescriptor descriptor = ServiceCollection.FirstOrDefault(x => x.ServiceType.Equals(requiredService)); + + if (descriptor != null) + { + concreteArgument = descriptor.ImplementationType?.GetTypeInfo(); + } if (concreteArgument == null) { - isValid = false; - break; + IEnumerable concreteArgumentCandidates = AssemblyDiscovery.Current.GetTypes(requiredService, parts); + concreteArgument = concreteArgumentCandidates.FirstOrDefault(); + + if (concreteArgument == null) + { + isValid = false; + break; + } } concreteArguments.Add(concreteArgument); diff --git a/zero.Web/ZeroBuilder.cs b/zero.Web/ZeroBuilder.cs index 28804855..6581dd33 100644 --- a/zero.Web/ZeroBuilder.cs +++ b/zero.Web/ZeroBuilder.cs @@ -79,7 +79,7 @@ namespace zero.Web { Mvc.AddRazorRuntimeCompilation(); } - Mvc.PartManager.FeatureProviders.Add(new ApiControllerFeatureProvider()); + Mvc.PartManager.FeatureProviders.Add(new ApiControllerFeatureProvider(Services)); // configure Raven + Identity