diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/IMemoryDatabase.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/IMemoryDatabase.cs index 1e6cd6f54c..9f2bf33a40 100644 --- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/IMemoryDatabase.cs +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/IMemoryDatabase.cs @@ -1,10 +1,10 @@ -using System.Collections.Generic; +using Volo.Abp.Domain.Entities; namespace Volo.Abp.Domain.Repositories.MemoryDb { public interface IMemoryDatabase { - List Collection(); + IMemoryDatabaseCollection Collection() where TEntity : class, IEntity; TKey GenerateNextId(); } diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/IMemoryDatabaseCollection.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/IMemoryDatabaseCollection.cs new file mode 100644 index 0000000000..f730bbbe48 --- /dev/null +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/IMemoryDatabaseCollection.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; + +namespace Volo.Abp.Domain.Repositories.MemoryDb +{ + public interface IMemoryDatabaseCollection : IEnumerable + { + void Add(TEntity entity); + + void Update(TEntity entity); + + void Remove(TEntity entity); + + bool Contains(TEntity entity); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/IMemoryDbRepository.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/IMemoryDbRepository.cs index dd241b25a5..c179b68931 100644 --- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/IMemoryDbRepository.cs +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/IMemoryDbRepository.cs @@ -8,7 +8,7 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb { IMemoryDatabase Database { get; } - List Collection { get; } + IMemoryDatabaseCollection Collection { get; } } public interface IMemoryDbRepository : IMemoryDbRepository, IRepository diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/IMemoryDbSerializer.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/IMemoryDbSerializer.cs new file mode 100644 index 0000000000..8dec50fb75 --- /dev/null +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/IMemoryDbSerializer.cs @@ -0,0 +1,9 @@ +namespace Volo.Abp.Domain.Repositories.MemoryDb +{ + public interface IMemoryDbSerializer + { + object Serialize(object obj); + + object Deserialize(object obj); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDatabase.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDatabase.cs index be16beef85..1df0397869 100644 --- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDatabase.cs +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDatabase.cs @@ -1,6 +1,7 @@ -using System; +using System; using System.Collections.Concurrent; using System.Collections.Generic; +using Volo.Abp.Domain.Entities; namespace Volo.Abp.Domain.Repositories.MemoryDb { @@ -16,9 +17,12 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb _entityIdGenerators = new ConcurrentDictionary(); } - public List Collection() + public IMemoryDatabaseCollection Collection() + where TEntity : class, IEntity { - return _sets.GetOrAdd(typeof(TEntity), _ => new List()) as List; + return _sets.GetOrAdd(typeof(TEntity), + _ => new MemoryDatabaseCollection(new MemoryDbBinarySerializer())) as + MemoryDatabaseCollection; } public TKey GenerateNextId() diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDatabaseCollection.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDatabaseCollection.cs new file mode 100644 index 0000000000..d7d77ce6f4 --- /dev/null +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDatabaseCollection.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Volo.Abp.Domain.Entities; + +namespace Volo.Abp.Domain.Repositories.MemoryDb +{ + public class MemoryDatabaseCollection : IMemoryDatabaseCollection + where TEntity : class, IEntity + { + private readonly Dictionary _dictionary = new Dictionary(); + + private readonly IMemoryDbSerializer _memoryDbSerializer; + + public MemoryDatabaseCollection(IMemoryDbSerializer memoryDbSerializer) + { + _memoryDbSerializer = memoryDbSerializer; + } + + public IEnumerator GetEnumerator() + { + foreach (var entity in _dictionary.Values) + { + yield return _memoryDbSerializer.Deserialize(entity).As(); + } + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Add(TEntity entity) + { + _dictionary.Add(GetEntityKey(entity), _memoryDbSerializer.Serialize(entity)); + } + + public void Update(TEntity entity) + { + if (_dictionary.ContainsKey(GetEntityKey(entity))) + { + _dictionary[GetEntityKey(entity)] = _memoryDbSerializer.Serialize(entity); + } + } + + public void Remove(TEntity entity) + { + _dictionary.Remove(GetEntityKey(entity)); + } + + public bool Contains(TEntity entity) + { + return _dictionary.ContainsKey(GetEntityKey(entity)); + } + + private string GetEntityKey(TEntity entity) + { + return entity.GetKeys().JoinAsString(","); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbBinarySerializer.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbBinarySerializer.cs new file mode 100644 index 0000000000..0dc0fb3e53 --- /dev/null +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbBinarySerializer.cs @@ -0,0 +1,29 @@ +using System.IO; +using System.Runtime.Serialization.Formatters.Binary; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Domain.Repositories.MemoryDb +{ + public class MemoryDbBinarySerializer : IMemoryDbSerializer, ITransientDependency + { + public object Serialize(object obj) + { + var stream = new MemoryStream(); + var formatter = new BinaryFormatter(); + formatter.Serialize(stream, obj); + return stream; + } + + public object Deserialize(object obj) + { + if (!(obj is MemoryStream stream)) + { + return null; + } + + var formatter = new BinaryFormatter(); + stream.Seek(0, SeekOrigin.Begin); + return formatter.Deserialize(stream); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs index c658a34ef4..0f82aa798b 100644 --- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs @@ -14,7 +14,7 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb { //TODO: Add dbcontext just like mongodb implementation! - public virtual List Collection => Database.Collection(); + public virtual IMemoryDatabaseCollection Collection => Database.Collection(); public virtual IMemoryDatabase Database => DatabaseProvider.GetDatabase(); @@ -33,6 +33,7 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb public override TEntity Update(TEntity entity, bool autoSave = false) { + Collection.Update(entity); return entity; } @@ -48,7 +49,7 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb public override long GetCount() { - return Collection.Count; + return Collection.Count(); } protected override IQueryable GetQueryable() diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDbCoreRepositoryExtensions.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDbCoreRepositoryExtensions.cs index 6f940ca146..1547a581e5 100644 --- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDbCoreRepositoryExtensions.cs +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDbCoreRepositoryExtensions.cs @@ -13,7 +13,7 @@ namespace Volo.Abp.Domain.Repositories return repository.ToMemoryDbRepository().Database; } - public static List GetCollection(this IBasicRepository repository) + public static IMemoryDatabaseCollection GetCollection(this IBasicRepository repository) where TEntity : class, IEntity { return repository.ToMemoryDbRepository().Collection; diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PeopleAppService.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PeopleAppService.cs index 05c6afb7dc..ef76becbc5 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PeopleAppService.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Application/PeopleAppService.cs @@ -35,7 +35,7 @@ namespace Volo.Abp.TestApp.Application var phone = new Phone(person.Id, phoneDto.Number, phoneDto.Type); person.Phones.Add(phone); - + Repository.Update(person); return ObjectMapper.Map(phone); } @@ -43,6 +43,7 @@ namespace Volo.Abp.TestApp.Application { var person = await GetEntityByIdAsync(id); person.Phones.RemoveAll(p => p.Number == number); + Repository.Update(person); } public Task GetWithComplexType(GetWithComplexTypeInput input) diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/City.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/City.cs index 76361463d7..92df3a166e 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/City.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/City.cs @@ -3,6 +3,7 @@ using Volo.Abp.Domain.Entities; namespace Volo.Abp.TestApp.Domain { + [Serializable] public class City : AggregateRoot { public string Name { get; set; } diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs index 8235225def..9b017ef51f 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Person.cs @@ -7,6 +7,7 @@ using Volo.Abp.MultiTenancy; namespace Volo.Abp.TestApp.Domain { [AutoMapTo(typeof(PersonEto))] + [Serializable] public class Person : FullAuditedAggregateRoot, IMultiTenant { public virtual Guid? TenantId { get; set; } diff --git a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Phone.cs b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Phone.cs index e53f2bc2e3..43087a7d87 100644 --- a/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Phone.cs +++ b/framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Domain/Phone.cs @@ -7,6 +7,7 @@ using Volo.Abp.Domain.Entities; namespace Volo.Abp.TestApp.Domain { [Table("AppPhones")] + [Serializable] public class Phone : Entity { public virtual Guid PersonId { get; set; }