added some extension and made available the code to bind easily to aspnetcore trough interface.
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using PoweredSoft.DynamicQuery.Core;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace PoweredSoft.DynamicQuery.AspNetCore.Json
|
||||
{
|
||||
public class DynamicQueryJsonConverter : JsonConverter
|
||||
{
|
||||
public override bool CanRead => true;
|
||||
public override bool CanWrite => false;
|
||||
|
||||
private Type[] DynamicQueryTypes { get; } = new Type[]
|
||||
{
|
||||
typeof(IFilter),
|
||||
typeof(ISimpleFilter),
|
||||
typeof(ICompositeFilter),
|
||||
typeof(IAggregate),
|
||||
typeof(ISort),
|
||||
typeof(IGroup),
|
||||
typeof(IQueryCriteria),
|
||||
typeof(IQueryHandler)
|
||||
};
|
||||
|
||||
public IServiceProvider ServiceProvider { get; }
|
||||
|
||||
public DynamicQueryJsonConverter(IServiceProvider serviceProvider)
|
||||
{
|
||||
ServiceProvider = serviceProvider;
|
||||
}
|
||||
|
||||
public override bool CanConvert(Type objectType) => objectType.IsInterface && DynamicQueryTypes.Contains(objectType);
|
||||
|
||||
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
|
||||
{
|
||||
if (reader.TokenType == JsonToken.Null)
|
||||
return (object)null;
|
||||
|
||||
if (objectType == typeof(IFilter))
|
||||
{
|
||||
var jo = JObject.Load(reader);
|
||||
|
||||
bool isComposite = false;
|
||||
if (jo.ContainsKey("type"))
|
||||
{
|
||||
isComposite = jo.GetValue("type").Value<string>()
|
||||
.Equals("composite", StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
else if (jo.ContainsKey("Type"))
|
||||
{
|
||||
isComposite = jo.GetValue("Type").Value<string>()
|
||||
.Equals("composite", StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("IFilter should have a type property..");
|
||||
}
|
||||
|
||||
var filterObj = ServiceProvider.GetService(isComposite ? typeof(ICompositeFilter) : typeof(ISimpleFilter));
|
||||
filterObj = jo.ToObject(filterObj.GetType());
|
||||
return filterObj;
|
||||
}
|
||||
|
||||
var obj = ServiceProvider.GetService(objectType);
|
||||
if (obj == null)
|
||||
throw new JsonSerializationException("No object created.");
|
||||
|
||||
serializer.Populate(reader, obj);
|
||||
return obj;
|
||||
}
|
||||
|
||||
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using PoweredSoft.DynamicQuery.AspNetCore.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace PoweredSoft.DynamicQuery.AspNetCore
|
||||
{
|
||||
public static class MvcBuilderExtensions
|
||||
{
|
||||
public static IMvcBuilder AddDynamicQueryJsonConverter(this IMvcBuilder builder, IServiceProvider serviceProvider)
|
||||
{
|
||||
builder.AddJsonOptions(o =>
|
||||
{
|
||||
o.SerializerSettings.Converters.Add(new DynamicQueryJsonConverter(serviceProvider));
|
||||
});
|
||||
return builder;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp2.1</TargetFramework>
|
||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||
<Copyright>Powered Softwares Inc.</Copyright>
|
||||
<PackageLicenseUrl>MIT</PackageLicenseUrl>
|
||||
<PackageProjectUrl>https://github.com/PoweredSoft/DynamicQuery</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/PoweredSoft/DynamicQuery</RepositoryUrl>
|
||||
<RepositoryType>github</RepositoryType>
|
||||
<PackageTags>powered,soft,dynamic,criteria,query,builder,asp,net,core</PackageTags>
|
||||
<Version>1.0.0</Version>
|
||||
<PackageIconUrl>https://secure.gravatar.com/avatar/4e32f73820c16718909a06c2927f1f8b?s=512&amp;r=g&amp;d=retro</PackageIconUrl>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.Formatters.Json" Version="2.1.3" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="2.1.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\PoweredSoft.DynamicQuery.Core\PoweredSoft.DynamicQuery.Core.csproj" />
|
||||
<ProjectReference Include="..\PoweredSoft.DynamicQuery\PoweredSoft.DynamicQuery.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -0,0 +1,22 @@
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using PoweredSoft.DynamicQuery.Core;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace PoweredSoft.DynamicQuery.AspNetCore
|
||||
{
|
||||
public static class ServiceCollectionExtensions
|
||||
{
|
||||
public static void AddDynamicQueryDefaultMappings(IServiceCollection services)
|
||||
{
|
||||
services.AddTransient<ISort, Sort>();
|
||||
services.AddTransient<IAggregate, Aggregate>();
|
||||
services.AddTransient<ISimpleFilter, SimpleFilter>();
|
||||
services.AddTransient<ICompositeFilter, CompositeFilter>();
|
||||
services.AddTransient<IGroup, Group>();
|
||||
services.AddTransient<IQueryCriteria, QueryCriteria>();
|
||||
services.AddTransient<IQueryHandler, QueryHandler>();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user