Browse Source

Merge pull request #10732 from abpframework/maliming/IValueValidatorFactory

Add `IValueValidatorFactory`
pull/11254/head
Halil İbrahim Kalkan 4 years ago
committed by GitHub
parent
commit
bc00752c01
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 9
      modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/AbpFeatureManagementApplicationContractsModule.cs
  2. 21
      modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/AbpFeatureManagementApplicationContractsOptions.cs
  3. 10
      modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/IValueValidatorFactory.cs
  4. 20
      modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/NewtonsoftStringValueTypeJsonConverter.cs
  5. 10
      modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/StringValueTypeJsonConverter.cs
  6. 24
      modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/ValueValidatorFactory.cs
  7. 19
      modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/ValueValidatorJsonConverter.cs
  8. 3
      modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/AbpFeatureManagementHttpApiModule.cs
  9. 2
      modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/NewtonsoftStringValueJsonConverter_Tests.cs
  10. 23
      modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/StringValueJsonConverter_Tests.cs
  11. 2
      modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/SystemTextJsonStringValueJsonConverter_Tests.cs
  12. 30
      modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/UrlValueValidator.cs

9
modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/AbpFeatureManagementApplicationContractsModule.cs

@ -1,4 +1,5 @@
using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Application;
using Volo.Abp.Authorization;
using Volo.Abp.FeatureManagement.JsonConverters;
@ -25,6 +26,12 @@ public class AbpFeatureManagementApplicationContractsModule : AbpModule
options.FileSets.AddEmbedded<AbpFeatureManagementApplicationContractsModule>();
});
var contractsOptionsActions = context.Services.GetPreConfigureActions<AbpFeatureManagementApplicationContractsOptions>();
Configure<AbpFeatureManagementApplicationContractsOptions>(options =>
{
contractsOptionsActions.Configure(options);
});
Configure<AbpNewtonsoftJsonSerializerOptions>(options =>
{
options.Converters.Add<NewtonsoftStringValueTypeJsonConverter>();
@ -32,7 +39,7 @@ public class AbpFeatureManagementApplicationContractsModule : AbpModule
Configure<AbpSystemTextJsonSerializerOptions>(options =>
{
options.JsonSerializerOptions.Converters.AddIfNotContains(new StringValueTypeJsonConverter());
options.JsonSerializerOptions.Converters.AddIfNotContains(new StringValueTypeJsonConverter(contractsOptionsActions.Configure()));
});
}
}

21
modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/AbpFeatureManagementApplicationContractsOptions.cs

@ -0,0 +1,21 @@
using System.Collections.Generic;
using Volo.Abp.FeatureManagement.JsonConverters;
using Volo.Abp.Validation.StringValues;
namespace Volo.Abp.FeatureManagement;
public class AbpFeatureManagementApplicationContractsOptions
{
public HashSet<IValueValidatorFactory> ValueValidatorFactory { get; }
public AbpFeatureManagementApplicationContractsOptions()
{
ValueValidatorFactory = new HashSet<IValueValidatorFactory>
{
new ValueValidatorFactory<AlwaysValidValueValidator>("NULL"),
new ValueValidatorFactory<BooleanValueValidator>("BOOLEAN"),
new ValueValidatorFactory<NumericValueValidator>("NUMERIC"),
new ValueValidatorFactory<StringValueValidator>("STRING")
};
}
}

10
modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/IValueValidatorFactory.cs

@ -0,0 +1,10 @@
using Volo.Abp.Validation.StringValues;
namespace Volo.Abp.FeatureManagement.JsonConverters;
public interface IValueValidatorFactory
{
bool CanCreate(string name);
IValueValidator Create();
}

20
modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/NewtonsoftStringValueTypeJsonConverter.cs

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Volo.Abp.DependencyInjection;
@ -13,6 +14,13 @@ public class NewtonsoftStringValueTypeJsonConverter : JsonConverter, ITransientD
{
public override bool CanWrite => false;
protected readonly AbpFeatureManagementApplicationContractsOptions Options;
public NewtonsoftStringValueTypeJsonConverter(IOptions<AbpFeatureManagementApplicationContractsOptions> options)
{
Options = options.Value;
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(IStringValueType);
@ -77,13 +85,11 @@ public class NewtonsoftStringValueTypeJsonConverter : JsonConverter, ITransientD
protected virtual IValueValidator CreateValueValidatorByName(JToken jObject, string name)
{
return name switch
foreach (var factory in Options.ValueValidatorFactory.Where(factory => factory.CanCreate(name)))
{
"NULL" => new AlwaysValidValueValidator(),
"BOOLEAN" => new BooleanValueValidator(),
"NUMERIC" => new NumericValueValidator(),
"STRING" => new StringValueValidator(),
_ => throw new ArgumentException($"{nameof(IValueValidator)} named {name} was not found!")
};
return factory.Create();
}
throw new ArgumentException($"{nameof(IValueValidator)} named {name} was cannot be created!");
}
}

10
modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/StringValueTypeJsonConverter.cs

@ -12,6 +12,13 @@ public class StringValueTypeJsonConverter : JsonConverter<IStringValueType>
private JsonSerializerOptions _writeJsonSerializerOptions;
protected readonly AbpFeatureManagementApplicationContractsOptions Options;
public StringValueTypeJsonConverter(AbpFeatureManagementApplicationContractsOptions options)
{
Options = options;
}
public override IStringValueType Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var rootElement = JsonDocument.ParseValue(ref reader).RootElement;
@ -21,7 +28,8 @@ public class StringValueTypeJsonConverter : JsonConverter<IStringValueType>
{
var name = nameJsonProperty.Value.GetString();
_readJsonSerializerOptions ??= JsonSerializerOptionsHelper.Create(options, this, new ValueValidatorJsonConverter(), new SelectionStringValueItemSourceJsonConverter());
_readJsonSerializerOptions ??= JsonSerializerOptionsHelper.Create(options, this, new ValueValidatorJsonConverter(Options),
new SelectionStringValueItemSourceJsonConverter());
return name switch
{

24
modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/ValueValidatorFactory.cs

@ -0,0 +1,24 @@
using Volo.Abp.Validation.StringValues;
namespace Volo.Abp.FeatureManagement.JsonConverters;
public class ValueValidatorFactory<TValueValidator> : IValueValidatorFactory
where TValueValidator : IValueValidator, new()
{
protected readonly string Name;
public ValueValidatorFactory(string name)
{
Name = name;
}
public bool CanCreate(string name)
{
return Name == name;
}
public IValueValidator Create()
{
return new TValueValidator() as IValueValidator;
}
}

19
modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/ValueValidatorJsonConverter.cs

@ -14,6 +14,13 @@ public class ValueValidatorJsonConverter : JsonConverter<IValueValidator>
private JsonSerializerOptions _writeJsonSerializerOptions;
protected readonly AbpFeatureManagementApplicationContractsOptions Options;
public ValueValidatorJsonConverter(AbpFeatureManagementApplicationContractsOptions options)
{
Options = options;
}
public override IValueValidator Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var rootElement = JsonDocument.ParseValue(ref reader).RootElement;
@ -51,13 +58,11 @@ public class ValueValidatorJsonConverter : JsonConverter<IValueValidator>
protected virtual IValueValidator CreateValueValidatorByName(string name)
{
return name switch
foreach (var factory in Options.ValueValidatorFactory.Where(factory => factory.CanCreate(name)))
{
"NULL" => new AlwaysValidValueValidator(),
"BOOLEAN" => new BooleanValueValidator(),
"NUMERIC" => new NumericValueValidator(),
"STRING" => new StringValueValidator(),
_ => throw new ArgumentException($"{nameof(IValueValidator)} named {name} was not found!")
};
return factory.Create();
}
throw new ArgumentException($"{nameof(IValueValidator)} named {name} was cannot be created!");
}
}

3
modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/AbpFeatureManagementHttpApiModule.cs

@ -32,9 +32,10 @@ public class AbpFeatureManagementHttpApiModule : AbpModule
.AddBaseTypes(typeof(AbpUiResource));
});
var contractsOptions = context.Services.ExecutePreConfiguredActions<AbpFeatureManagementApplicationContractsOptions>();
Configure<JsonOptions>(options =>
{
options.JsonSerializerOptions.Converters.AddIfNotContains(new StringValueTypeJsonConverter());
options.JsonSerializerOptions.Converters.AddIfNotContains(new StringValueTypeJsonConverter(contractsOptions));
});
}
}

2
modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/NewtonsoftStringValueJsonConverter_Tests.cs

@ -9,7 +9,7 @@ public class NewtonsoftStringValueJsonConverter_Tests : StringValueJsonConverter
{
services.PreConfigure<AbpJsonOptions>(options =>
{
options.UseHybridSerializer = true;
options.UseHybridSerializer = false;
});
}
}

23
modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/StringValueJsonConverter_Tests.cs

@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection;
using Shouldly;
using Volo.Abp.FeatureManagement.JsonConverters;
using Volo.Abp.Json;
using Volo.Abp.Validation.StringValues;
using Xunit;
@ -16,6 +18,16 @@ public abstract class StringValueJsonConverter_Tests : FeatureManagementApplicat
_jsonSerializer = GetRequiredService<IJsonSerializer>();
}
protected override void BeforeAddApplication(IServiceCollection services)
{
services.PreConfigure<AbpFeatureManagementApplicationContractsOptions>(options =>
{
options.ValueValidatorFactory.Add(new ValueValidatorFactory<UrlValueValidator>("URL"));
});
base.BeforeAddApplication(services);
}
[Fact]
public void Should_Serialize_And_Deserialize()
{
@ -67,6 +79,13 @@ public abstract class StringValueJsonConverter_Tests : FeatureManagementApplicat
Name = "FeatureName",
Key = "FeatureKey"
}
},
new FeatureDto
{
ValueType = new FreeTextStringValueType
{
Validator = new UrlValueValidator("https")
}
}
}
}
@ -95,5 +114,9 @@ public abstract class StringValueJsonConverter_Tests : FeatureManagementApplicat
featureListDto2.Groups[0].Features[3].Provider.Name.ShouldBe("FeatureName");
featureListDto2.Groups[0].Features[3].Provider.Key.ShouldBe("FeatureKey");
featureListDto2.Groups[0].Features[4].ValueType.ShouldBeOfType<FreeTextStringValueType>();
featureListDto2.Groups[0].Features[4].ValueType.Validator.ShouldBeOfType<UrlValueValidator>();
featureListDto2.Groups[0].Features[4].ValueType.Validator.As<UrlValueValidator>().Scheme.ShouldBe("https");
}
}

2
modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/SystemTextJsonStringValueJsonConverter_Tests.cs

@ -9,7 +9,7 @@ public class SystemTextJsonStringValueJsonConverter_Tests : StringValueJsonConve
{
services.PreConfigure<AbpJsonOptions>(options =>
{
options.UseHybridSerializer = false;
options.UseHybridSerializer = true;
});
}
}

30
modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/UrlValueValidator.cs

@ -0,0 +1,30 @@
using System;
using Volo.Abp.Validation.StringValues;
namespace Volo.Abp.FeatureManagement;
[Serializable]
[ValueValidator("URL")]
public class UrlValueValidator : ValueValidatorBase
{
public string Scheme {
get => this["Scheme"].ToString();
set => this["Scheme"] = value;
}
public UrlValueValidator()
{
}
public UrlValueValidator(string scheme)
{
Scheme = scheme;
}
public override bool IsValid(object value)
{
var s = value.ToString();
return s != null && s.StartsWith(Scheme);
}
}
Loading…
Cancel
Save