Browse Source

Implemented and tested IObjectSerializer

pull/216/head
Halil İbrahim Kalkan 9 years ago
parent
commit
983b38b107
  1. 27
      Volo.Abp.sln
  2. 1
      src/Volo.Abp.Caching/Volo.Abp.Caching.csproj
  3. 2
      src/Volo.Abp.Caching/Volo.Abp.Caching.csproj.DotSettings
  4. 4
      src/Volo.Abp.Caching/Volo/Abp/Caching/AbpCachingModule.cs
  5. 46
      src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs
  6. 28
      src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs
  7. 1
      src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/PermissionStore.cs
  8. 20
      src/Volo.Abp.Serialization/Volo.Abp.Serialization.csproj
  9. 2
      src/Volo.Abp.Serialization/Volo.Abp.Serialization.csproj.DotSettings
  10. 28
      src/Volo.Abp.Serialization/Volo/Abp/Serialization/AbpSerializationModule.cs
  11. 126
      src/Volo.Abp.Serialization/Volo/Abp/Serialization/Binary/BinarySerializationHelper.cs
  12. 69
      src/Volo.Abp.Serialization/Volo/Abp/Serialization/DefaultObjectSerializer.cs
  13. 16
      src/Volo.Abp.Serialization/Volo/Abp/Serialization/IObjectSerializer.cs
  14. 1
      src/Volo.Abp/Volo.Abp.csproj
  15. 2
      src/Volo.Abp/Volo/Abp/AbpCommonModule.cs
  16. 24
      test/Volo.Abp.Caching.Tests/Volo.Abp.Caching.Tests.csproj
  17. 14
      test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/AbpCachingTestModule.cs
  18. 40
      test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs
  19. 20
      test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/PersonCacheItem.cs
  20. 24
      test/Volo.Abp.Serialization.Tests/Volo.Abp.Serialization.Tests.csproj
  21. 14
      test/Volo.Abp.Serialization.Tests/Volo/Abp/Serialization/AbpSerializationTestModule.cs
  22. 38
      test/Volo.Abp.Serialization.Tests/Volo/Abp/Serialization/ObjectSerializer_Tests.cs
  23. 20
      test/Volo.Abp.Serialization.Tests/Volo/Abp/Serialization/Objects/Car.cs
  24. 21
      test/Volo.Abp.Serialization.Tests/Volo/Abp/Serialization/Objects/CarSerializer.cs
  25. 20
      test/Volo.Abp.Serialization.Tests/Volo/Abp/Serialization/Objects/Person.cs

27
Volo.Abp.sln

@ -274,11 +274,17 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Permissions.Applic
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Permissions.Application", "src\Volo.Abp.Permissions.Application\Volo.Abp.Permissions.Application.csproj", "{90197499-CBB6-4C8C-90E6-8718CD755C04}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Caching", "src\Volo.Abp.Caching\Volo.Abp.Caching.csproj", "{A5B650AB-A67F-4A4C-9F81-7B5471CA1331}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Caching", "src\Volo.Abp.Caching\Volo.Abp.Caching.csproj", "{A5B650AB-A67F-4A4C-9F81-7B5471CA1331}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.EventBus", "src\Volo.Abp.EventBus\Volo.Abp.EventBus.csproj", "{D9455AE7-2E0C-4647-9880-F5831BCEE3D8}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.EventBus", "src\Volo.Abp.EventBus\Volo.Abp.EventBus.csproj", "{D9455AE7-2E0C-4647-9880-F5831BCEE3D8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.EventBus.Tests", "test\Volo.Abp.EventBus.Tests\Volo.Abp.EventBus.Tests.csproj", "{8C327AA0-BBED-4F8B-A88E-1DD97B04E58F}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.EventBus.Tests", "test\Volo.Abp.EventBus.Tests\Volo.Abp.EventBus.Tests.csproj", "{8C327AA0-BBED-4F8B-A88E-1DD97B04E58F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Caching.Tests", "test\Volo.Abp.Caching.Tests\Volo.Abp.Caching.Tests.csproj", "{B417D97C-330A-42CE-BDC6-93355B0A959A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Serialization", "src\Volo.Abp.Serialization\Volo.Abp.Serialization.csproj", "{38EF3EC8-9915-4216-B646-4BEE07006943}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Serialization.Tests", "test\Volo.Abp.Serialization.Tests\Volo.Abp.Serialization.Tests.csproj", "{65FB5893-7CB6-4694-A692-7E666E347D29}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -734,6 +740,18 @@ Global
{8C327AA0-BBED-4F8B-A88E-1DD97B04E58F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8C327AA0-BBED-4F8B-A88E-1DD97B04E58F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8C327AA0-BBED-4F8B-A88E-1DD97B04E58F}.Release|Any CPU.Build.0 = Release|Any CPU
{B417D97C-330A-42CE-BDC6-93355B0A959A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B417D97C-330A-42CE-BDC6-93355B0A959A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B417D97C-330A-42CE-BDC6-93355B0A959A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B417D97C-330A-42CE-BDC6-93355B0A959A}.Release|Any CPU.Build.0 = Release|Any CPU
{38EF3EC8-9915-4216-B646-4BEE07006943}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{38EF3EC8-9915-4216-B646-4BEE07006943}.Debug|Any CPU.Build.0 = Debug|Any CPU
{38EF3EC8-9915-4216-B646-4BEE07006943}.Release|Any CPU.ActiveCfg = Release|Any CPU
{38EF3EC8-9915-4216-B646-4BEE07006943}.Release|Any CPU.Build.0 = Release|Any CPU
{65FB5893-7CB6-4694-A692-7E666E347D29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{65FB5893-7CB6-4694-A692-7E666E347D29}.Debug|Any CPU.Build.0 = Debug|Any CPU
{65FB5893-7CB6-4694-A692-7E666E347D29}.Release|Any CPU.ActiveCfg = Release|Any CPU
{65FB5893-7CB6-4694-A692-7E666E347D29}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -870,6 +888,9 @@ Global
{A5B650AB-A67F-4A4C-9F81-7B5471CA1331} = {4C753F64-0C93-4D65-96C2-A40893AFC1E8}
{D9455AE7-2E0C-4647-9880-F5831BCEE3D8} = {4C753F64-0C93-4D65-96C2-A40893AFC1E8}
{8C327AA0-BBED-4F8B-A88E-1DD97B04E58F} = {37087D1B-3693-4E96-983D-A69F210BDE53}
{B417D97C-330A-42CE-BDC6-93355B0A959A} = {37087D1B-3693-4E96-983D-A69F210BDE53}
{38EF3EC8-9915-4216-B646-4BEE07006943} = {4C753F64-0C93-4D65-96C2-A40893AFC1E8}
{65FB5893-7CB6-4694-A692-7E666E347D29} = {37087D1B-3693-4E96-983D-A69F210BDE53}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5}

1
src/Volo.Abp.Caching/Volo.Abp.Caching.csproj

@ -19,6 +19,7 @@
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Core\Volo.Abp.Core.csproj" />
<ProjectReference Include="..\Volo.Abp.Threading\Volo.Abp.Threading.csproj" />
</ItemGroup>
</Project>

2
src/Volo.Abp.Caching/Volo.Abp.Caching.csproj.DotSettings

@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/CSharpLanguageProject/LanguageLevel/@EntryValue">CSharp71</s:String></wpf:ResourceDictionary>

4
src/Volo.Abp.Caching/Volo/Abp/Caching/AbpCachingModule.cs

@ -1,8 +1,10 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;
using Volo.Abp.Threading;
namespace Volo.Abp.Caching
{
[DependsOn(typeof(AbpThreadingModule))]
public class AbpCachingModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)
@ -11,6 +13,8 @@ namespace Volo.Abp.Caching
services.AddDistributedMemoryCache();
services.AddAssemblyOf<AbpCachingModule>();
services.AddSingleton(typeof(IDistributedCache<>), typeof(DistributedCache<>));
}
}
}

46
src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs

@ -0,0 +1,46 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Caching.Distributed;
using Volo.Abp.Threading;
namespace Volo.Abp.Caching
{
public class DistributedCache<TCacheItem> : IDistributedCache<TCacheItem>
where TCacheItem : class
{
protected IDistributedCache Cache { get; }
public ICancellationTokenProvider CancellationTokenProvider { get; }
public DistributedCache(
IDistributedCache cache,
ICancellationTokenProvider cancellationTokenProvider)
{
Cache = cache;
CancellationTokenProvider = cancellationTokenProvider;
}
public async Task<TCacheItem> GetAsync(string key, CancellationToken token = default)
{
var cachedValue = await Cache.GetAsync(key, CancellationTokenProvider.FallbackToProvider(token));
if (cachedValue == null)
{
return null;
}
throw new NotImplementedException();
}
public Task SetAsync(string key, TCacheItem value, DistributedCacheEntryOptions options = null,
CancellationToken token = default)
{
throw new System.NotImplementedException();
}
public Task RemoveAsync(string key, CancellationToken token = default)
{
return Cache.RemoveAsync(key, CancellationTokenProvider.FallbackToProvider(token));
}
}
}

28
src/Volo.Abp.Caching/Volo/Abp/Caching/IDistributedCache.cs

@ -0,0 +1,28 @@
using System.Threading;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Microsoft.Extensions.Caching.Distributed;
namespace Volo.Abp.Caching
{
public interface IDistributedCache<TCacheItem>
where TCacheItem : class
{
Task<TCacheItem> GetAsync(
[NotNull] string key,
CancellationToken token = default
);
Task SetAsync(
[NotNull] string key,
[NotNull] TCacheItem value,
[CanBeNull] DistributedCacheEntryOptions options = null,
CancellationToken token = default
);
Task RemoveAsync(
string key,
CancellationToken token = default
);
}
}

1
src/Volo.Abp.Permissions.Domain/Volo/Abp/Permissions/PermissionStore.cs

@ -11,6 +11,7 @@ using Volo.Abp.Threading;
namespace Volo.Abp.Permissions
{
//TODO: Extract cache invalidate logic to another class
public class PermissionStore : AbpServiceBase, IPermissionStore, IAsyncEventHandler<EntityChangedEventData<PermissionGrant>>, ITransientDependency
{
private readonly IPermissionGrantRepository _permissionGrantRepository;

20
src/Volo.Abp.Serialization/Volo.Abp.Serialization.csproj

@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>Volo.Abp.Serialization</AssemblyName>
<PackageId>Volo.Abp.Serialization</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Core\Volo.Abp.Core.csproj" />
</ItemGroup>
</Project>

2
src/Volo.Abp.Serialization/Volo.Abp.Serialization.csproj.DotSettings

@ -0,0 +1,2 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/CSharpLanguageProject/LanguageLevel/@EntryValue">CSharp71</s:String></wpf:ResourceDictionary>

28
src/Volo.Abp.Serialization/Volo/Abp/Serialization/AbpSerializationModule.cs

@ -0,0 +1,28 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;
using Volo.Abp.Reflection;
namespace Volo.Abp.Serialization
{
public class AbpSerializationModule : AbpModule
{
public override void PreConfigureServices(IServiceCollection services)
{
services.OnExposing(context =>
{
//Register types for IObjectSerializer<T> if implements
context.ExposedTypes.AddRange(
ReflectionHelper.GetImplementedGenericTypes(
context.ImplementationType,
typeof(IObjectSerializer<>)
)
);
});
}
public override void ConfigureServices(IServiceCollection services)
{
services.AddAssemblyOf<AbpSerializationModule>();
}
}
}

126
src/Volo.Abp.Serialization/Volo/Abp/Serialization/Binary/BinarySerializationHelper.cs

@ -0,0 +1,126 @@
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace Volo.Abp.Serialization.Binary
{
/// <summary>
/// This class is used to simplify serialization/deserialization operations.
/// Uses .NET binary serialization.
/// </summary>
public static class BinarySerializationHelper
{
/// <summary>
/// Serializes an object and returns as a byte array.
/// </summary>
/// <param name="obj">object to be serialized</param>
/// <returns>bytes of object</returns>
public static byte[] Serialize(object obj)
{
using (var memoryStream = new MemoryStream())
{
Serialize(obj, memoryStream);
return memoryStream.ToArray();
}
}
/// <summary>
/// Serializes an object into a stream.
/// </summary>
/// <param name="obj">object to be serialized</param>
/// <param name="stream">Stream to serialize in</param>
/// <returns>bytes of object</returns>
public static void Serialize(object obj, Stream stream)
{
CreateBinaryFormatter().Serialize(stream, obj);
}
/// <summary>
/// Deserializes an object from given byte array.
/// </summary>
/// <param name="bytes">The byte array that contains object</param>
/// <returns>deserialized object</returns>
public static object Deserialize(byte[] bytes)
{
using (var memoryStream = new MemoryStream(bytes))
{
return Deserialize(memoryStream);
}
}
/// <summary>
/// Deserializes an object from given stream.
/// </summary>
/// <param name="stream">The stream that contains object</param>
/// <returns>deserialized object</returns>
public static object Deserialize(Stream stream)
{
return CreateBinaryFormatter().Deserialize(stream);
}
/// <summary>
/// Deserializes an object from given byte array.
/// Difference from <see cref="Deserialize(byte[])"/> is that; this method can also deserialize
/// types that are defined in dynamically loaded assemblies (like PlugIns).
/// </summary>
/// <param name="bytes">The byte array that contains object</param>
/// <returns>deserialized object</returns>
public static object DeserializeExtended(byte[] bytes)
{
using (var memoryStream = new MemoryStream(bytes))
{
return CreateBinaryFormatter(true).Deserialize(memoryStream);
}
}
/// <summary>
/// Deserializes an object from given stream.
/// Difference from <see cref="Deserialize(Stream)"/> is that; this method can also deserialize
/// types that are defined in dynamically loaded assemblies (like PlugIns).
/// </summary>
/// <param name="stream">The stream that contains object</param>
/// <returns>deserialized object</returns>
public static object DeserializeExtended(Stream stream)
{
return CreateBinaryFormatter(true).Deserialize(stream);
}
private static BinaryFormatter CreateBinaryFormatter(bool extended = false)
{
if (extended)
{
return new BinaryFormatter
{
//TODO: AssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple,
Binder = new ExtendedSerializationBinder()
};
}
else
{
return new BinaryFormatter();
}
}
/// <summary>
/// This class is used in deserializing to allow deserializing objects that are defined
/// in assemlies that are load in runtime (like PlugIns).
/// </summary>
private sealed class ExtendedSerializationBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
var toAssemblyName = assemblyName.Split(',')[0];
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
if (assembly.FullName.Split(',')[0] == toAssemblyName)
{
return assembly.GetType(typeName);
}
}
return Type.GetType(string.Format("{0}, {1}", typeName, assemblyName));
}
}
}
}

69
src/Volo.Abp.Serialization/Volo/Abp/Serialization/DefaultObjectSerializer.cs

@ -0,0 +1,69 @@
using System;
using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Serialization.Binary;
namespace Volo.Abp.Serialization
{
public class DefaultObjectSerializer : IObjectSerializer, ITransientDependency
{
private readonly IServiceProvider _serviceProvider;
public DefaultObjectSerializer(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public virtual byte[] Serialize<T>(T obj)
{
if (obj == null)
{
return null;
}
//Check if a specific serializer is registered
using (var scope = _serviceProvider.CreateScope())
{
var specificSerializer = scope.ServiceProvider.GetService<IObjectSerializer<T>>();
if (specificSerializer != null)
{
return specificSerializer.Serialize(obj);
}
}
return AutoSerialize(obj);
}
[CanBeNull]
public virtual T Deserialize<T>(byte[] bytes)
{
if (bytes == null)
{
return default;
}
//Check if a specific serializer is registered
using (var scope = _serviceProvider.CreateScope())
{
var specificSerializer = scope.ServiceProvider.GetService<IObjectSerializer<T>>();
if (specificSerializer != null)
{
return specificSerializer.Deserialize(bytes);
}
}
return AutoDeserialize<T>(bytes);
}
protected virtual byte[] AutoSerialize<T>(T obj)
{
return BinarySerializationHelper.Serialize(obj);
}
protected virtual T AutoDeserialize<T>(byte[] bytes)
{
return (T) BinarySerializationHelper.DeserializeExtended(bytes);
}
}
}

16
src/Volo.Abp.Serialization/Volo/Abp/Serialization/IObjectSerializer.cs

@ -0,0 +1,16 @@
namespace Volo.Abp.Serialization
{
public interface IObjectSerializer
{
byte[] Serialize<T>(T obj);
T Deserialize<T>(byte[] bytes);
}
public interface IObjectSerializer<T>
{
byte[] Serialize(T obj);
T Deserialize(byte[] bytes);
}
}

1
src/Volo.Abp/Volo.Abp.csproj

@ -24,6 +24,7 @@
<ProjectReference Include="..\Volo.Abp.MultiTenancy.Abstractions\Volo.Abp.MultiTenancy.Abstractions.csproj" />
<ProjectReference Include="..\Volo.Abp.ObjectMapping\Volo.Abp.ObjectMapping.csproj" />
<ProjectReference Include="..\Volo.Abp.Security\Volo.Abp.Security.csproj" />
<ProjectReference Include="..\Volo.Abp.Serialization\Volo.Abp.Serialization.csproj" />
<ProjectReference Include="..\Volo.Abp.Session\Volo.Abp.Session.csproj" />
<ProjectReference Include="..\Volo.Abp.Settings\Volo.Abp.Settings.csproj" />
<ProjectReference Include="..\Volo.Abp.Validation\Volo.Abp.Validation.csproj" />

2
src/Volo.Abp/Volo/Abp/AbpCommonModule.cs

@ -9,6 +9,7 @@ using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
using Volo.Abp.ObjectMapping;
using Volo.Abp.Security;
using Volo.Abp.Serialization;
using Volo.Abp.Session;
using Volo.Abp.Settings;
using Volo.Abp.Validation;
@ -29,6 +30,7 @@ namespace Volo.Abp
[DependsOn(typeof(AbpApiVersioningAbstractionsModule))]
[DependsOn(typeof(AbpMultiTenancyAbstractionsModule))]
[DependsOn(typeof(AbpCachingModule))]
[DependsOn(typeof(AbpSerializationModule))]
public class AbpCommonModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)

24
test/Volo.Abp.Caching.Tests/Volo.Abp.Caching.Tests.csproj

@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<LangVersion>latest</LangVersion>
<AssemblyName>Volo.Abp.Caching.Tests</AssemblyName>
<PackageId>Volo.Abp.Caching.Tests</PackageId>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.Caching\Volo.Abp.Caching.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
</ItemGroup>
</Project>

14
test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/AbpCachingTestModule.cs

@ -0,0 +1,14 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;
namespace Volo.Abp.Caching
{
[DependsOn(typeof(AbpCachingModule))]
public class AbpCachingTestModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)
{
services.AddAssemblyOf<AbpCachingTestModule>();
}
}
}

40
test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/DistributedCache_Tests.cs

@ -0,0 +1,40 @@
using System;
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.TestBase;
using Xunit;
namespace Volo.Abp.Caching
{
public class DistributedCache_Tests : AbpIntegratedTest<AbpCachingTestModule>
{
[Fact]
public async Task Should_Set_Get_And_Remove_Cache_Items()
{
var personCache = GetRequiredService<IDistributedCache<PersonCacheItem>>();
var cacheKey = Guid.NewGuid().ToString();
const string personName = "john nash";
//Get (not exists yet)
var cacheItem = await personCache.GetAsync(cacheKey);
cacheItem.ShouldBeNull();
//Set
cacheItem = new PersonCacheItem(personName);
await personCache.SetAsync(cacheKey, cacheItem);
//Get (it should be available now
cacheItem = await personCache.GetAsync(cacheKey);
cacheItem.ShouldNotBeNull();
cacheItem.Name.ShouldBe(personName);
//Remove
await personCache.RemoveAsync(cacheKey);
//Get (not exists since removed)
cacheItem = await personCache.GetAsync(cacheKey);
cacheItem.ShouldBeNull();
}
}
}

20
test/Volo.Abp.Caching.Tests/Volo/Abp/Caching/PersonCacheItem.cs

@ -0,0 +1,20 @@
using System;
namespace Volo.Abp.Caching
{
[Serializable]
public class PersonCacheItem
{
public string Name { get; private set; }
private PersonCacheItem()
{
}
public PersonCacheItem(string name)
{
Name = name;
}
}
}

24
test/Volo.Abp.Serialization.Tests/Volo.Abp.Serialization.Tests.csproj

@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<LangVersion>latest</LangVersion>
<AssemblyName>Volo.Abp.Serialization.Tests</AssemblyName>
<PackageId>Volo.Abp.Serialization.Tests</PackageId>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.Serialization\Volo.Abp.Serialization.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
</ItemGroup>
</Project>

14
test/Volo.Abp.Serialization.Tests/Volo/Abp/Serialization/AbpSerializationTestModule.cs

@ -0,0 +1,14 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;
namespace Volo.Abp.Serialization
{
[DependsOn(typeof(AbpSerializationModule))]
public class AbpSerializationTestModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)
{
services.AddAssemblyOf<AbpSerializationTestModule>();
}
}
}

38
test/Volo.Abp.Serialization.Tests/Volo/Abp/Serialization/ObjectSerializer_Tests.cs

@ -0,0 +1,38 @@
using Shouldly;
using Volo.Abp.Serialization.Objects;
using Volo.Abp.TestBase;
using Xunit;
namespace Volo.Abp.Serialization
{
public class ObjectSerializer_Tests : AbpIntegratedTest<AbpSerializationTestModule>
{
private readonly IObjectSerializer _serializer;
public ObjectSerializer_Tests()
{
_serializer = GetRequiredService<IObjectSerializer>();
}
[Fact]
public void Should_Return_Null_For_Null_Object()
{
_serializer.Serialize<Person>(null).ShouldBeNull();
_serializer.Deserialize<Person>((byte[])null).ShouldBeNull();
}
[Fact]
public void Simple_Serialize_Deserialize()
{
_serializer.Deserialize<Person>(_serializer.Serialize(new Person("john"))).Name.ShouldBe("john");
}
[Fact]
public void Should_Use_Specific_Serializer_If_Available()
{
_serializer.Deserialize<Car>(_serializer.Serialize(new Car("xc40"))).Name.ShouldBe("xc40-serialized-deserialized");
}
//TODO: Other methods
}
}

20
test/Volo.Abp.Serialization.Tests/Volo/Abp/Serialization/Objects/Car.cs

@ -0,0 +1,20 @@
using System;
namespace Volo.Abp.Serialization.Objects
{
[Serializable]
public class Car
{
public string Name { get; set; }
private Car()
{
}
public Car(string name)
{
Name = name;
}
}
}

21
test/Volo.Abp.Serialization.Tests/Volo/Abp/Serialization/Objects/CarSerializer.cs

@ -0,0 +1,21 @@
using Volo.Abp.DependencyInjection;
using Volo.Abp.Serialization.Binary;
namespace Volo.Abp.Serialization.Objects
{
public class CarSerializer : IObjectSerializer<Car>, ITransientDependency
{
public byte[] Serialize(Car obj)
{
obj.Name += "-serialized";
return BinarySerializationHelper.Serialize(obj);
}
public Car Deserialize(byte[] bytes)
{
var car = (Car)BinarySerializationHelper.DeserializeExtended(bytes);
car.Name += "-deserialized";
return car;
}
}
}

20
test/Volo.Abp.Serialization.Tests/Volo/Abp/Serialization/Objects/Person.cs

@ -0,0 +1,20 @@
using System;
namespace Volo.Abp.Serialization.Objects
{
[Serializable]
public class Person
{
public string Name { get; private set; }
private Person()
{
}
public Person(string name)
{
Name = name;
}
}
}
Loading…
Cancel
Save