Skip to content

Remove assembly scanning from DynamoDBEntryConversion #3258

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -384,54 +384,59 @@ internal PrimitiveList ItemsToPrimitiveList(IEnumerable items)
private ConverterCache ConverterCache = new ConverterCache();
private ConversionSchema OriginalConversion;

private void AddConverters(string suffix)
{
var typedConverterType = typeof(Converter);
var assembly = typeof(DynamoDBEntryConversion).Assembly;

var allTypes = assembly.GetTypes();

foreach (var type in allTypes)
{
string fullName = type.FullName;

//if (type.Namespace != typedConverterType.Namespace)
// continue;

if (type.IsAbstract)
continue;

if (!type.Name.EndsWith(suffix, StringComparison.Ordinal))
continue;

if (!typedConverterType.IsAssignableFrom(type))
continue;

AddConverter(type);
}
}
internal void AddConverter(Converter converter)
{
ConverterCache.AddConverter(converter, this);
}

#if NET8_0_OR_GREATER
internal void AddConverter([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] Type type)
#else
internal void AddConverter(Type type)
#endif
{
var converter = Activator.CreateInstance(type) as Converter;
AddConverter(converter);
}

private void SetV1Converters()
{
AddConverters("ConverterV1");
AddConverter(new ByteConverterV1());
AddConverter(new SByteConverterV1());
AddConverter(new UInt16ConverterV1());
AddConverter(new Int16ConverterV1());
AddConverter(new UInt32ConverterV1());
AddConverter(new Int32ConverterV1());
AddConverter(new UInt64ConverterV1());
AddConverter(new Int64ConverterV1());
AddConverter(new SingleConverterV1());
AddConverter(new DoubleConverterV1());
AddConverter(new DecimalConverterV1());
AddConverter(new CharConverterV1());
AddConverter(new StringConverterV1());
AddConverter(new DateTimeConverterV1());
AddConverter(new GuidConverterV1());
AddConverter(new BytesConverterV1());
AddConverter(new MemoryStreamConverterV1());
AddConverter(new EnumConverterV1());
AddConverter(new BoolConverterV1());
AddConverter(new PrimitiveCollectionConverterV1());
AddConverter(new DictionaryConverterV1());
}

private void SetV2Converters()
{
AddConverters("ConverterV2");
AddConverter(new ByteConverterV2());
AddConverter(new SByteConverterV2());
AddConverter(new UInt16ConverterV2());
AddConverter(new Int16ConverterV2());
AddConverter(new UInt32ConverterV2());
AddConverter(new Int32ConverterV2());
AddConverter(new UInt64ConverterV2());
AddConverter(new Int64ConverterV2());
AddConverter(new SingleConverterV2());
AddConverter(new DoubleConverterV2());
AddConverter(new DecimalConverterV2());
AddConverter(new CharConverterV2());
AddConverter(new StringConverterV2());
AddConverter(new DateTimeConverterV2());
AddConverter(new GuidConverterV2());
AddConverter(new BytesConverterV2());
AddConverter(new MemoryStreamConverterV2());
AddConverter(new DictionaryConverterV2());
AddConverter(new EnumConverterV2());
AddConverter(new BoolConverterV2());
AddConverter(new CollectionConverterV2());
}

// Converts items to Primitives.
Expand Down Expand Up @@ -460,7 +465,7 @@ private IEnumerable<Primitive> ToPrimitives(IEnumerable items, Type elementType)
}
}

#endregion
#endregion
}

internal abstract class Converter
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
using Amazon.DynamoDBv2;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

namespace AWSSDK_DotNet35.UnitTests
{
[TestClass]
public class DynamoDBEntryConversionTests
{
[TestMethod]
public void ValidateAllConvertersAreRegisteredForConversionV1()
{
AssertAllConvertersAreRegistered(DynamoDBEntryConversion.V1, "ConverterV1");
}

[TestMethod]
public void ValidateAllConvertersAreRegisteredForConversionV2()
{
AssertAllConvertersAreRegistered(DynamoDBEntryConversion.V2, "ConverterV2");
}

private void AssertAllConvertersAreRegistered(DynamoDBEntryConversion conversion, string suffix)
{
var converters = GetConverters(suffix);

var tryGetConverterInfo = conversion.GetType().GetMethod("TryGetConverter", BindingFlags.NonPublic | BindingFlags.Instance);

foreach (var converter in converters)
{
var getTargetTypeInfo = converter.GetType().GetMethod("GetTargetTypes");
IEnumerable<Type> targetTypes = (IEnumerable<Type>)getTargetTypeInfo.Invoke(converter, new object[0]);
foreach (var type in targetTypes)
{
var tryGetConverterParams = new object[] { type, null };
tryGetConverterInfo.Invoke(conversion, tryGetConverterParams);
var registeredConverter = tryGetConverterParams[1];

Assert.IsNotNull(registeredConverter);
Assert.AreEqual(converter.GetType(), registeredConverter.GetType());
}
}
}

private IEnumerable<object> GetConverters(string suffix)
{
const string converterTypeName = "Amazon.DynamoDBv2.Converter";
var assembly = typeof(DynamoDBEntryConversion).Assembly;

var allTypes = assembly.GetTypes();
var typedConverterType = allTypes.FirstOrDefault(x => string.Equals(converterTypeName, x.FullName));

foreach (var type in allTypes)
{
if (type.IsAbstract)
continue;

if (!type.Name.EndsWith(suffix, StringComparison.Ordinal))
continue;

if (!typedConverterType.IsAssignableFrom(type))
continue;

var constructor = type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, new Type[0], null);
yield return constructor.Invoke(new object[0]);
}
}
}
}