From 65f7421ef4e58a6b4052b832d42db3d7ef5ad037 Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Thu, 28 May 2020 01:14:26 +0200 Subject: [PATCH] ability to use collection attribute on base interfaces --- zero.Core/Api/LanguagesApi.cs | 9 ++-- zero.Core/Entities/Language.cs | 6 ++- .../Extensions/DocumentStoreExtensions.cs | 24 ++++++++++- .../Extensions/ServiceCollectionExtensions.cs | 41 +++---------------- 4 files changed, 34 insertions(+), 46 deletions(-) diff --git a/zero.Core/Api/LanguagesApi.cs b/zero.Core/Api/LanguagesApi.cs index c1becc7c..31fd38f5 100644 --- a/zero.Core/Api/LanguagesApi.cs +++ b/zero.Core/Api/LanguagesApi.cs @@ -14,12 +14,9 @@ namespace zero.Core.Api { public class LanguagesApi : BackofficeApi, ILanguagesApi where T : ILanguage { - IValidator Validator; - - - public LanguagesApi(IBackofficeStore store, IValidator validator) : base(store) + public LanguagesApi(IBackofficeStore store) : base(store) { - Validator = validator; + } @@ -75,7 +72,7 @@ namespace zero.Core.Api /// public async Task> Save(T model) { - return await SaveModel(model, Validator); + return await SaveModel(model, null); } diff --git a/zero.Core/Entities/Language.cs b/zero.Core/Entities/Language.cs index f679262d..2c113cd1 100644 --- a/zero.Core/Entities/Language.cs +++ b/zero.Core/Entities/Language.cs @@ -1,4 +1,6 @@ -namespace zero.Core.Entities +using zero.Core.Attributes; + +namespace zero.Core.Entities { public class Language : ZeroEntity, ILanguage { @@ -12,7 +14,7 @@ public string InheritedLanguageId { get; set; } } - + [Collection("Languages")] public interface ILanguage : IZeroEntity, IZeroDbConventions { /// diff --git a/zero.Core/Extensions/DocumentStoreExtensions.cs b/zero.Core/Extensions/DocumentStoreExtensions.cs index 9b746d85..898130fa 100644 --- a/zero.Core/Extensions/DocumentStoreExtensions.cs +++ b/zero.Core/Extensions/DocumentStoreExtensions.cs @@ -21,13 +21,16 @@ namespace zero.Core.Extensions { Type[] polymorphTypes = new Type[2] { typeof(SpaceContent), typeof(Page) }; + Type dbConventionType = typeof(IZeroDbConventions); store.Conventions.IdentityPartsSeparator = "."; store.Conventions.FindCollectionName = type => { + Type finalType = type; + // do not alter non-internal entities - if (!typeof(IZeroDbConventions).IsAssignableFrom(type)) + if (!dbConventionType.IsAssignableFrom(type)) { return DocumentConventions.DefaultGetCollectionName(type); } @@ -39,9 +42,26 @@ namespace zero.Core.Extensions return collection.Name; } + // use base interface if available + Type interfaceBaseType = type.GetInterfaces().FirstOrDefault(x => x.IsInterface && dbConventionType.IsAssignableFrom(x) && x.Name != dbConventionType.Name); + + if (interfaceBaseType != null) + { + // use name from attribute if available + collection = interfaceBaseType.GetCustomAttribute(true); + if (collection != null) + { + return options.Raven.CollectionPrefix + collection.Name; + } + } + // use base type for polymorphism Type polymorphBaseType = polymorphTypes.FirstOrDefault(x => type.IsSubclassOf(x)); - Type finalType = polymorphBaseType ?? type; + + if (polymorphBaseType != null) + { + finalType = polymorphBaseType; + } return options.Raven.CollectionPrefix + DocumentConventions.DefaultGetCollectionName(finalType); }; diff --git a/zero.Core/Extensions/ServiceCollectionExtensions.cs b/zero.Core/Extensions/ServiceCollectionExtensions.cs index 0eed3146..e5cd4fba 100644 --- a/zero.Core/Extensions/ServiceCollectionExtensions.cs +++ b/zero.Core/Extensions/ServiceCollectionExtensions.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using System; using System.Collections.Generic; using System.Linq; @@ -53,11 +54,11 @@ namespace zero.Core.Extensions /// /// Adds or overrides an implementation /// - public static void Replace(this IServiceCollection services) + public static void Replace(this IServiceCollection services, ServiceLifetime lifetime = ServiceLifetime.Transient) where TService : class where TImplementation : class, TService { - services.Remove(out ServiceLifetime lifetime); + services.RemoveAll(); services.Add(new ServiceDescriptor(typeof(TService), typeof(TImplementation), lifetime)); } @@ -65,44 +66,12 @@ namespace zero.Core.Extensions /// /// Adds or overrides an implementation /// - public static void Replace(this IServiceCollection services, Func implementationFactory) + public static void Replace(this IServiceCollection services, Func implementationFactory, ServiceLifetime lifetime = ServiceLifetime.Transient) where TService : class where TImplementation : class, TService { - services.Remove(out ServiceLifetime lifetime); + services.RemoveAll(); services.Add(new ServiceDescriptor(typeof(TService), implementationFactory, lifetime)); } - - - /// - /// Removes all instances of a registered service - /// - public static bool Remove(this IServiceCollection services) => services.Remove(out ServiceLifetime lifetime); - - - /// - /// Removes all instances of a registered service - /// - public static bool Remove(this IServiceCollection services, out ServiceLifetime lifetime) - { - Type serviceType = typeof(TService); - IEnumerable descriptors = services.Where(x => x.ServiceType == serviceType); - - if (descriptors.Any()) - { - lifetime = descriptors.First().Lifetime; - - foreach (ServiceDescriptor descriptor in descriptors) - { - services.Remove(descriptor); - } - } - else - { - lifetime = ServiceLifetime.Transient; - } - - return descriptors.Any(); - } } }