Browse Source

Use IServiceScopeFactory in AbpHybridJsonSerializer.

pull/5952/head
maliming 6 years ago
parent
commit
f7cf19f335
  1. 31
      framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpHybridJsonSerializer.cs

31
framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpHybridJsonSerializer.cs

@ -10,37 +10,46 @@ namespace Volo.Abp.Json
{ {
protected AbpJsonOptions Options { get; } protected AbpJsonOptions Options { get; }
protected IServiceProvider ServiceProvider { get; } protected IServiceScopeFactory ServiceScopeFactory { get; }
public AbpHybridJsonSerializer(IOptions<AbpJsonOptions> options, IServiceProvider serviceProvider) public AbpHybridJsonSerializer(IOptions<AbpJsonOptions> options, IServiceScopeFactory serviceScopeFactory)
{ {
Options = options.Value; Options = options.Value;
ServiceProvider = serviceProvider; ServiceScopeFactory = serviceScopeFactory;
} }
public string Serialize(object obj, bool camelCase = true, bool indented = false) public string Serialize(object obj, bool camelCase = true, bool indented = false)
{ {
var provider = GetSerializerProvider(obj.GetType()); using (var scope = ServiceScopeFactory.CreateScope())
return provider.Serialize(obj, camelCase, indented); {
var serializerProvider = GetSerializerProvider(scope.ServiceProvider, obj.GetType());
return serializerProvider.Serialize(obj, camelCase, indented);
}
} }
public T Deserialize<T>(string jsonString, bool camelCase = true) public T Deserialize<T>(string jsonString, bool camelCase = true)
{ {
var provider = GetSerializerProvider(typeof(T)); using (var scope = ServiceScopeFactory.CreateScope())
return provider.Deserialize<T>(jsonString, camelCase); {
var serializerProvider = GetSerializerProvider(scope.ServiceProvider, typeof(T));
return serializerProvider.Deserialize<T>(jsonString, camelCase);
}
} }
public object Deserialize(Type type, string jsonString, bool camelCase = true) public object Deserialize(Type type, string jsonString, bool camelCase = true)
{ {
var provider = GetSerializerProvider(type); using (var scope = ServiceScopeFactory.CreateScope())
return provider.Deserialize(type, jsonString, camelCase); {
var serializerProvider = GetSerializerProvider(scope.ServiceProvider, type);
return serializerProvider.Deserialize(type, jsonString, camelCase);
}
} }
protected virtual IJsonSerializerProvider GetSerializerProvider(Type type) protected virtual IJsonSerializerProvider GetSerializerProvider(IServiceProvider serviceProvider, Type type)
{ {
foreach (var providerType in Options.Providers.Reverse()) foreach (var providerType in Options.Providers.Reverse())
{ {
var provider = ServiceProvider.GetRequiredService(providerType) as IJsonSerializerProvider; var provider = serviceProvider.GetRequiredService(providerType) as IJsonSerializerProvider;
if (provider.CanHandle(type)) if (provider.CanHandle(type))
{ {
return provider; return provider;

Loading…
Cancel
Save