Skip to content

Commit ac47b33

Browse files
committed
Merge branch 'dynamodb_remove_assembly_scanning' of https://github.com/Dreamescaper/aws-sdk-net into Dreamescaper-dynamodb_remove_assembly_scanning
2 parents 8d3de46 + 009c9be commit ac47b33

File tree

2 files changed

+115
-39
lines changed

2 files changed

+115
-39
lines changed

sdk/src/Services/DynamoDBv2/Custom/Conversion/DynamoDBEntryConversion.cs

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -384,54 +384,59 @@ internal PrimitiveList ItemsToPrimitiveList(IEnumerable items)
384384
private ConverterCache ConverterCache = new ConverterCache();
385385
private ConversionSchema OriginalConversion;
386386

387-
private void AddConverters(string suffix)
388-
{
389-
var typedConverterType = typeof(Converter);
390-
var assembly = typeof(DynamoDBEntryConversion).Assembly;
391-
392-
var allTypes = assembly.GetTypes();
393-
394-
foreach (var type in allTypes)
395-
{
396-
string fullName = type.FullName;
397-
398-
//if (type.Namespace != typedConverterType.Namespace)
399-
// continue;
400-
401-
if (type.IsAbstract)
402-
continue;
403-
404-
if (!type.Name.EndsWith(suffix, StringComparison.Ordinal))
405-
continue;
406-
407-
if (!typedConverterType.IsAssignableFrom(type))
408-
continue;
409-
410-
AddConverter(type);
411-
}
412-
}
413387
internal void AddConverter(Converter converter)
414388
{
415389
ConverterCache.AddConverter(converter, this);
416390
}
417391

418-
#if NET8_0_OR_GREATER
419-
internal void AddConverter([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] Type type)
420-
#else
421-
internal void AddConverter(Type type)
422-
#endif
423-
{
424-
var converter = Activator.CreateInstance(type) as Converter;
425-
AddConverter(converter);
426-
}
427-
428392
private void SetV1Converters()
429393
{
430-
AddConverters("ConverterV1");
394+
AddConverter(new ByteConverterV1());
395+
AddConverter(new SByteConverterV1());
396+
AddConverter(new UInt16ConverterV1());
397+
AddConverter(new Int16ConverterV1());
398+
AddConverter(new UInt32ConverterV1());
399+
AddConverter(new Int32ConverterV1());
400+
AddConverter(new UInt64ConverterV1());
401+
AddConverter(new Int64ConverterV1());
402+
AddConverter(new SingleConverterV1());
403+
AddConverter(new DoubleConverterV1());
404+
AddConverter(new DecimalConverterV1());
405+
AddConverter(new CharConverterV1());
406+
AddConverter(new StringConverterV1());
407+
AddConverter(new DateTimeConverterV1());
408+
AddConverter(new GuidConverterV1());
409+
AddConverter(new BytesConverterV1());
410+
AddConverter(new MemoryStreamConverterV1());
411+
AddConverter(new EnumConverterV1());
412+
AddConverter(new BoolConverterV1());
413+
AddConverter(new PrimitiveCollectionConverterV1());
414+
AddConverter(new DictionaryConverterV1());
431415
}
416+
432417
private void SetV2Converters()
433418
{
434-
AddConverters("ConverterV2");
419+
AddConverter(new ByteConverterV2());
420+
AddConverter(new SByteConverterV2());
421+
AddConverter(new UInt16ConverterV2());
422+
AddConverter(new Int16ConverterV2());
423+
AddConverter(new UInt32ConverterV2());
424+
AddConverter(new Int32ConverterV2());
425+
AddConverter(new UInt64ConverterV2());
426+
AddConverter(new Int64ConverterV2());
427+
AddConverter(new SingleConverterV2());
428+
AddConverter(new DoubleConverterV2());
429+
AddConverter(new DecimalConverterV2());
430+
AddConverter(new CharConverterV2());
431+
AddConverter(new StringConverterV2());
432+
AddConverter(new DateTimeConverterV2());
433+
AddConverter(new GuidConverterV2());
434+
AddConverter(new BytesConverterV2());
435+
AddConverter(new MemoryStreamConverterV2());
436+
AddConverter(new DictionaryConverterV2());
437+
AddConverter(new EnumConverterV2());
438+
AddConverter(new BoolConverterV2());
439+
AddConverter(new CollectionConverterV2());
435440
}
436441

437442
// Converts items to Primitives.
@@ -460,7 +465,7 @@ private IEnumerable<Primitive> ToPrimitives(IEnumerable items, Type elementType)
460465
}
461466
}
462467

463-
#endregion
468+
#endregion
464469
}
465470

466471
internal abstract class Converter
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using Amazon.DynamoDBv2;
2+
using Microsoft.VisualStudio.TestTools.UnitTesting;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Reflection;
7+
8+
namespace AWSSDK_DotNet35.UnitTests
9+
{
10+
[TestClass]
11+
public class DynamoDBEntryConversionTests
12+
{
13+
[TestMethod]
14+
public void ValidateAllConvertersAreRegisteredForConversionV1()
15+
{
16+
AssertAllConvertersAreRegistered(DynamoDBEntryConversion.V1, "ConverterV1");
17+
}
18+
19+
[TestMethod]
20+
public void ValidateAllConvertersAreRegisteredForConversionV2()
21+
{
22+
AssertAllConvertersAreRegistered(DynamoDBEntryConversion.V2, "ConverterV2");
23+
}
24+
25+
private void AssertAllConvertersAreRegistered(DynamoDBEntryConversion conversion, string suffix)
26+
{
27+
var converters = GetConverters(suffix);
28+
29+
var tryGetConverterInfo = conversion.GetType().GetMethod("TryGetConverter", BindingFlags.NonPublic | BindingFlags.Instance);
30+
31+
foreach (var converter in converters)
32+
{
33+
var getTargetTypeInfo = converter.GetType().GetMethod("GetTargetTypes");
34+
IEnumerable<Type> targetTypes = (IEnumerable<Type>)getTargetTypeInfo.Invoke(converter, new object[0]);
35+
foreach (var type in targetTypes)
36+
{
37+
var tryGetConverterParams = new object[] { type, null };
38+
tryGetConverterInfo.Invoke(conversion, tryGetConverterParams);
39+
var registeredConverter = tryGetConverterParams[1];
40+
41+
Assert.IsNotNull(registeredConverter);
42+
Assert.AreEqual(converter.GetType(), registeredConverter.GetType());
43+
}
44+
}
45+
}
46+
47+
private IEnumerable<object> GetConverters(string suffix)
48+
{
49+
const string converterTypeName = "Amazon.DynamoDBv2.Converter";
50+
var assembly = typeof(DynamoDBEntryConversion).Assembly;
51+
52+
var allTypes = assembly.GetTypes();
53+
var typedConverterType = allTypes.FirstOrDefault(x => string.Equals(converterTypeName, x.FullName));
54+
55+
foreach (var type in allTypes)
56+
{
57+
if (type.IsAbstract)
58+
continue;
59+
60+
if (!type.Name.EndsWith(suffix, StringComparison.Ordinal))
61+
continue;
62+
63+
if (!typedConverterType.IsAssignableFrom(type))
64+
continue;
65+
66+
var constructor = type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, new Type[0], null);
67+
yield return constructor.Invoke(new object[0]);
68+
}
69+
}
70+
}
71+
}

0 commit comments

Comments
 (0)