Browse Source

Change Dictionary<string, object> to ExtraPropertyDictionary for IHasExtraProperties

pull/6114/head
Halil İbrahim Kalkan 6 years ago
parent
commit
c198dd8f9e
  1. 6
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditLogActionInfo.cs
  2. 6
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditLogInfo.cs
  3. 4
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/EntityChangeInfo.cs
  4. 11
      framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/AggregateRoot.cs
  5. 4
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Modeling/AbpEntityTypeBuilderExtensions.cs
  6. 8
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ValueComparers/ExtraPropertyDictionaryValueComparer.cs
  7. 10
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ValueConverters/ExtraPropertiesValueConverter.cs
  8. 14
      framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/IHasExtraProperties.cs
  9. 4
      framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/ExtensibleObject.cs

6
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditLogActionInfo.cs

@ -17,11 +17,11 @@ namespace Volo.Abp.Auditing
public int ExecutionDuration { get; set; } public int ExecutionDuration { get; set; }
public Dictionary<string, object> ExtraProperties { get; } public ExtraPropertyDictionary ExtraProperties { get; }
public AuditLogActionInfo() public AuditLogActionInfo()
{ {
ExtraProperties = new Dictionary<string, object>(); ExtraProperties = new ExtraPropertyDictionary();
} }
} }
} }

6
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditLogInfo.cs

@ -47,7 +47,7 @@ namespace Volo.Abp.Auditing
public List<Exception> Exceptions { get; } public List<Exception> Exceptions { get; }
public Dictionary<string, object> ExtraProperties { get; } public ExtraPropertyDictionary ExtraProperties { get; }
public List<EntityChangeInfo> EntityChanges { get; } public List<EntityChangeInfo> EntityChanges { get; }
@ -57,7 +57,7 @@ namespace Volo.Abp.Auditing
{ {
Actions = new List<AuditLogActionInfo>(); Actions = new List<AuditLogActionInfo>();
Exceptions = new List<Exception>(); Exceptions = new List<Exception>();
ExtraProperties = new Dictionary<string, object>(); ExtraProperties = new ExtraPropertyDictionary();
EntityChanges = new List<EntityChangeInfo>(); EntityChanges = new List<EntityChangeInfo>();
Comments = new List<string>(); Comments = new List<string>();
} }
@ -107,4 +107,4 @@ namespace Volo.Abp.Auditing
return sb.ToString(); return sb.ToString();
} }
} }
} }

4
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/EntityChangeInfo.cs

@ -25,13 +25,13 @@ namespace Volo.Abp.Auditing
public List<EntityPropertyChangeInfo> PropertyChanges { get; set; } public List<EntityPropertyChangeInfo> PropertyChanges { get; set; }
public Dictionary<string, object> ExtraProperties { get; } public ExtraPropertyDictionary ExtraProperties { get; }
public virtual object EntityEntry { get; set; } //TODO: Try to remove since it breaks serializability public virtual object EntityEntry { get; set; } //TODO: Try to remove since it breaks serializability
public EntityChangeInfo() public EntityChangeInfo()
{ {
ExtraProperties = new Dictionary<string, object>(); ExtraProperties = new ExtraPropertyDictionary();
} }
public virtual void Merge(EntityChangeInfo changeInfo) public virtual void Merge(EntityChangeInfo changeInfo)

11
framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/AggregateRoot.cs

@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Volo.Abp.Auditing; using Volo.Abp.Auditing;
using Volo.Abp.Data; using Volo.Abp.Data;
@ -13,7 +12,7 @@ namespace Volo.Abp.Domain.Entities
IHasExtraProperties, IHasExtraProperties,
IHasConcurrencyStamp IHasConcurrencyStamp
{ {
public virtual Dictionary<string, object> ExtraProperties { get; protected set; } public virtual ExtraPropertyDictionary ExtraProperties { get; protected set; }
[DisableAuditing] [DisableAuditing]
public virtual string ConcurrencyStamp { get; set; } public virtual string ConcurrencyStamp { get; set; }
@ -21,7 +20,7 @@ namespace Volo.Abp.Domain.Entities
protected AggregateRoot() protected AggregateRoot()
{ {
ConcurrencyStamp = Guid.NewGuid().ToString("N"); ConcurrencyStamp = Guid.NewGuid().ToString("N");
ExtraProperties = new Dictionary<string, object>(); ExtraProperties = new ExtraPropertyDictionary();
this.SetDefaultsForExtraProperties(); this.SetDefaultsForExtraProperties();
} }
@ -39,7 +38,7 @@ namespace Volo.Abp.Domain.Entities
IHasExtraProperties, IHasExtraProperties,
IHasConcurrencyStamp IHasConcurrencyStamp
{ {
public virtual Dictionary<string, object> ExtraProperties { get; protected set; } public virtual ExtraPropertyDictionary ExtraProperties { get; protected set; }
[DisableAuditing] [DisableAuditing]
public virtual string ConcurrencyStamp { get; set; } public virtual string ConcurrencyStamp { get; set; }
@ -47,7 +46,7 @@ namespace Volo.Abp.Domain.Entities
protected AggregateRoot() protected AggregateRoot()
{ {
ConcurrencyStamp = Guid.NewGuid().ToString("N"); ConcurrencyStamp = Guid.NewGuid().ToString("N");
ExtraProperties = new Dictionary<string, object>(); ExtraProperties = new ExtraPropertyDictionary();
this.SetDefaultsForExtraProperties(); this.SetDefaultsForExtraProperties();
} }
@ -55,7 +54,7 @@ namespace Volo.Abp.Domain.Entities
: base(id) : base(id)
{ {
ConcurrencyStamp = Guid.NewGuid().ToString("N"); ConcurrencyStamp = Guid.NewGuid().ToString("N");
ExtraProperties = new Dictionary<string, object>(); ExtraProperties = new ExtraPropertyDictionary();
this.SetDefaultsForExtraProperties(); this.SetDefaultsForExtraProperties();
} }

4
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/Modeling/AbpEntityTypeBuilderExtensions.cs

@ -60,10 +60,10 @@ namespace Volo.Abp.EntityFrameworkCore.Modeling
return; return;
} }
b.Property<Dictionary<string, object>>(nameof(IHasExtraProperties.ExtraProperties)) b.Property<ExtraPropertyDictionary>(nameof(IHasExtraProperties.ExtraProperties))
.HasColumnName(nameof(IHasExtraProperties.ExtraProperties)) .HasColumnName(nameof(IHasExtraProperties.ExtraProperties))
.HasConversion(new ExtraPropertiesValueConverter(b.Metadata.ClrType)) .HasConversion(new ExtraPropertiesValueConverter(b.Metadata.ClrType))
.Metadata.SetValueComparer(new AbpDictionaryValueComparer<string, object>()); .Metadata.SetValueComparer(new ExtraPropertyDictionaryValueComparer());
b.TryConfigureObjectExtensions(); b.TryConfigureObjectExtensions();
} }

8
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ValueComparers/AbpDictionaryValueComparer.cs → framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ValueComparers/ExtraPropertyDictionaryValueComparer.cs

@ -1,17 +1,17 @@
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.ChangeTracking;
using Volo.Abp.Data;
namespace Volo.Abp.EntityFrameworkCore.ValueComparers namespace Volo.Abp.EntityFrameworkCore.ValueComparers
{ {
public class AbpDictionaryValueComparer<TKey, TValue> : ValueComparer<Dictionary<TKey, TValue>> public class ExtraPropertyDictionaryValueComparer : ValueComparer<ExtraPropertyDictionary>
{ {
public AbpDictionaryValueComparer() public ExtraPropertyDictionaryValueComparer()
: base( : base(
(d1, d2) => d1.SequenceEqual(d2), (d1, d2) => d1.SequenceEqual(d2),
d => d.Aggregate(0, (k, v) => HashCode.Combine(k, v.GetHashCode())), d => d.Aggregate(0, (k, v) => HashCode.Combine(k, v.GetHashCode())),
d => d.ToDictionary(k => k.Key, v => v.Value)) d => new ExtraPropertyDictionary(d))
{ {
} }
} }

10
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ValueConverters/ExtraPropertiesValueConverter.cs

@ -2,12 +2,13 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Text.Json; using System.Text.Json;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Volo.Abp.Data;
using Volo.Abp.Json.SystemTextJson.JsonConverters; using Volo.Abp.Json.SystemTextJson.JsonConverters;
using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectExtending;
namespace Volo.Abp.EntityFrameworkCore.ValueConverters namespace Volo.Abp.EntityFrameworkCore.ValueConverters
{ {
public class ExtraPropertiesValueConverter : ValueConverter<Dictionary<string, object>, string> public class ExtraPropertiesValueConverter : ValueConverter<ExtraPropertyDictionary, string>
{ {
public ExtraPropertiesValueConverter(Type entityType) public ExtraPropertiesValueConverter(Type entityType)
: base( : base(
@ -17,7 +18,7 @@ namespace Volo.Abp.EntityFrameworkCore.ValueConverters
} }
private static string SerializeObject(Dictionary<string, object> extraProperties, Type entityType) private static string SerializeObject(ExtraPropertyDictionary extraProperties, Type entityType)
{ {
var copyDictionary = new Dictionary<string, object>(extraProperties); var copyDictionary = new Dictionary<string, object>(extraProperties);
@ -39,11 +40,12 @@ namespace Volo.Abp.EntityFrameworkCore.ValueConverters
return JsonSerializer.Serialize(copyDictionary); return JsonSerializer.Serialize(copyDictionary);
} }
private static Dictionary<string, object> DeserializeObject(string extraPropertiesAsJson, Type entityType) private static ExtraPropertyDictionary DeserializeObject(string extraPropertiesAsJson, Type entityType)
{ {
var deserializeOptions = new JsonSerializerOptions(); var deserializeOptions = new JsonSerializerOptions();
deserializeOptions.Converters.Add(new ObjectToInferredTypesConverter()); deserializeOptions.Converters.Add(new ObjectToInferredTypesConverter());
var dictionary = JsonSerializer.Deserialize<Dictionary<string, object>>(extraPropertiesAsJson, deserializeOptions) ?? new Dictionary<string, object>(); var dictionary = JsonSerializer.Deserialize<ExtraPropertyDictionary>(extraPropertiesAsJson, deserializeOptions) ??
new ExtraPropertyDictionary();
if (entityType != null) if (entityType != null)
{ {
var objectExtension = ObjectExtensionManager.Instance.GetOrNull(entityType); var objectExtension = ObjectExtensionManager.Instance.GetOrNull(entityType);

14
framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/IHasExtraProperties.cs

@ -6,6 +6,18 @@ namespace Volo.Abp.Data
public interface IHasExtraProperties public interface IHasExtraProperties
{ {
Dictionary<string, object> ExtraProperties { get; } ExtraPropertyDictionary ExtraProperties { get; }
}
public class ExtraPropertyDictionary : Dictionary<string, object>
{
public ExtraPropertyDictionary()
{
}
public ExtraPropertyDictionary(IDictionary<string, object> dictionary)
: base(dictionary)
{
}
} }
} }

4
framework/src/Volo.Abp.ObjectExtending/Volo/Abp/ObjectExtending/ExtensibleObject.cs

@ -9,7 +9,7 @@ namespace Volo.Abp.ObjectExtending
[Serializable] [Serializable]
public class ExtensibleObject : IHasExtraProperties, IValidatableObject public class ExtensibleObject : IHasExtraProperties, IValidatableObject
{ {
public Dictionary<string, object> ExtraProperties { get; protected set; } public ExtraPropertyDictionary ExtraProperties { get; protected set; }
public ExtensibleObject() public ExtensibleObject()
: this(true) : this(true)
@ -19,7 +19,7 @@ namespace Volo.Abp.ObjectExtending
public ExtensibleObject(bool setDefaultsForExtraProperties) public ExtensibleObject(bool setDefaultsForExtraProperties)
{ {
ExtraProperties = new Dictionary<string, object>(); ExtraProperties = new ExtraPropertyDictionary();
if (setDefaultsForExtraProperties) if (setDefaultsForExtraProperties)
{ {

Loading…
Cancel
Save