Skip to content

Commit f1576fc

Browse files
committed
Upgrading to 11.0
1 parent 1b87d23 commit f1576fc

16 files changed

+74
-74
lines changed

.github/workflows/ci.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ jobs:
1111
build:
1212
strategy:
1313
fail-fast: false
14-
runs-on: windows-latest
14+
runs-on: windows-2022
1515
steps:
1616
- name: Checkout
1717
uses: actions/checkout@v2

.github/workflows/release.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ jobs:
88
build:
99
strategy:
1010
fail-fast: false
11-
runs-on: windows-latest
11+
runs-on: windows-2022
1212
steps:
1313
- name: Checkout
1414
uses: actions/checkout@v2

AutoMapper.Collection.sln

+2-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio Version 16
4-
VisualStudioVersion = 16.0.29411.108
3+
# Visual Studio Version 17
4+
VisualStudioVersion = 17.1.32210.238
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{578F2483-CF08-409D-A316-31BCB7C5D9D0}"
77
ProjectSection(SolutionItems) = preProject
@@ -20,8 +20,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoMapper.Collection", "sr
2020
EndProject
2121
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoMapper.Collection.EntityFramework", "src\AutoMapper.Collection.EntityFramework\AutoMapper.Collection.EntityFramework.csproj", "{E0FD41FD-AF5B-4BEC-970F-8412E7B6C914}"
2222
EndProject
23-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoMapper.Collection.LinqToSQL", "src\AutoMapper.Collection.LinqToSQL\AutoMapper.Collection.LinqToSQL.csproj", "{A0A023B6-D02A-4CD3-9B3D-3B3022DB001A}"
24-
EndProject
2523
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoMapper.Collection.Tests", "src\AutoMapper.Collection.Tests\AutoMapper.Collection.Tests.csproj", "{2D3D34AD-6A0A-4382-9A2F-894F52D184A7}"
2624
EndProject
2725
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutoMapper.Collection.EntityFramework.Tests", "src\AutoMapper.Collection.EntityFramework.Tests\AutoMapper.Collection.EntityFramework.Tests.csproj", "{BDE127AB-AC3F-44DF-BC33-210DAFD12E15}"
@@ -40,10 +38,6 @@ Global
4038
{E0FD41FD-AF5B-4BEC-970F-8412E7B6C914}.Debug|Any CPU.Build.0 = Debug|Any CPU
4139
{E0FD41FD-AF5B-4BEC-970F-8412E7B6C914}.Release|Any CPU.ActiveCfg = Release|Any CPU
4240
{E0FD41FD-AF5B-4BEC-970F-8412E7B6C914}.Release|Any CPU.Build.0 = Release|Any CPU
43-
{A0A023B6-D02A-4CD3-9B3D-3B3022DB001A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
44-
{A0A023B6-D02A-4CD3-9B3D-3B3022DB001A}.Debug|Any CPU.Build.0 = Debug|Any CPU
45-
{A0A023B6-D02A-4CD3-9B3D-3B3022DB001A}.Release|Any CPU.ActiveCfg = Release|Any CPU
46-
{A0A023B6-D02A-4CD3-9B3D-3B3022DB001A}.Release|Any CPU.Build.0 = Release|Any CPU
4741
{2D3D34AD-6A0A-4382-9A2F-894F52D184A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
4842
{2D3D34AD-6A0A-4382-9A2F-894F52D184A7}.Debug|Any CPU.Build.0 = Debug|Any CPU
4943
{2D3D34AD-6A0A-4382-9A2F-894F52D184A7}.Release|Any CPU.ActiveCfg = Release|Any CPU

src/AutoMapper.Collection.EntityFramework.Tests/AutoMapper.Collection.EntityFramework.Tests.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>net461;netcoreapp3.0</TargetFrameworks>
4+
<TargetFrameworks>net6.0</TargetFrameworks>
55
<AssemblyName>AutoMapper.Collection.EntityFramework.Tests</AssemblyName>
66
<IsPackable>false</IsPackable>
77
</PropertyGroup>

src/AutoMapper.Collection.EntityFramework/AutoMapper.Collection.EntityFramework.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<PropertyGroup>
44
<Description>Collection updating support for EntityFramework with AutoMapper. Extends DBSet&lt;T&gt; with Persist&lt;TDto&gt;().InsertUpdate(dto) and Persist&lt;TDto&gt;().Delete(dto). Will find the matching object and will Insert/Update/Delete.</Description>
55
<Authors>Tyler Carlson</Authors>
6-
<TargetFrameworks>net461;netstandard2.1</TargetFrameworks>
6+
<TargetFrameworks>netstandard2.1</TargetFrameworks>
77
<AssemblyName>AutoMapper.Collection.EntityFramework</AssemblyName>
88
<PackageId>AutoMapper.Collection.EntityFramework</PackageId>
99
<PackageIcon>icon.png</PackageIcon>

src/AutoMapper.Collection.Tests/AutoMapper.Collection.Tests.csproj

+1-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>net461;netcoreapp2.0</TargetFrameworks>
4+
<TargetFrameworks>net6.0</TargetFrameworks>
55
<AssemblyName>AutoMapper.Collection.Tests</AssemblyName>
66
<RootNamespace>AutoMapper.Collection</RootNamespace>
77
<IsPackable>false</IsPackable>
@@ -11,11 +11,6 @@
1111
<ProjectReference Include="..\AutoMapper.Collection\AutoMapper.Collection.csproj" />
1212
</ItemGroup>
1313

14-
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
15-
<Reference Include="System" />
16-
<Reference Include="Microsoft.CSharp" />
17-
</ItemGroup>
18-
1914
<ItemGroup>
2015
<PackageReference Include="FluentAssertions" Version="$(FluentAssertions)" />
2116
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(TestSDKVersion)" />

src/AutoMapper.Collection.Tests/InheritanceWithCollectionTests.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using AutoMapper.EquivalencyExpression;
22
using System.Collections.Generic;
33
using System.Linq;
4+
using AutoMapper.Internal;
45
using FluentAssertions;
56
using Xunit;
67

@@ -14,7 +15,7 @@ public abstract class InheritanceWithCollectionTests : MappingTestBase
1415
public void TypeMap_Should_include_base_types()
1516
{
1617
var mapper = CreateMapper(ConfigureMapper);
17-
var typeMap = mapper.ConfigurationProvider.ResolveTypeMap(typeof(MailOrderDomain), typeof(OrderEf));
18+
var typeMap = mapper.ConfigurationProvider.Internal().ResolveTypeMap(typeof(MailOrderDomain), typeof(OrderEf));
1819

1920
var typePairs = new[]{
2021
new TypePair(typeof(OrderDomain), typeof(OrderEf))
@@ -26,7 +27,7 @@ public void TypeMap_Should_include_base_types()
2627
public void TypeMap_Should_include_derivied_types()
2728
{
2829
var mapper = CreateMapper(ConfigureMapper);
29-
var typeMap = mapper.ConfigurationProvider.ResolveTypeMap(typeof(OrderDomain), typeof(OrderEf));
30+
var typeMap = mapper.ConfigurationProvider.Internal().ResolveTypeMap(typeof(OrderDomain), typeof(OrderEf));
3031

3132
var typePairs = new[]{
3233
new TypePair(typeof(OnlineOrderDomain), typeof(OnlineOrderEf)),

src/AutoMapper.Collection.Tests/MapCollectionWithEqualityTests.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -339,9 +339,9 @@ public void Parent_Should_Be_Same_As_Root_Object()
339339
cfg =>
340340
{
341341
cfg.AddCollectionMappers();
342-
cfg.CreateMap<ThingWithCollection, ThingWithCollection>();
342+
cfg.CreateMap<ThingWithCollection, ThingWithCollection>().PreserveReferences();
343343
cfg.CreateMap<ThingCollectionItem, ThingCollectionItem>()
344-
.EqualityComparison((src, dst) => src.ID == dst.ID);
344+
.EqualityComparison((src, dst) => src.ID == dst.ID).PreserveReferences();
345345
});
346346

347347
var root = new ThingWithCollection()

src/AutoMapper.Collection/AutoMapper.Collection.csproj

+2-3
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33
<PropertyGroup>
44
<Description>Collection Add/Remove/Update support for AutoMapper. AutoMapper.Collection adds EqualityComparison Expressions for TypeMaps to determine if Source and Destination type are equivalent to each other when mapping collections.</Description>
55
<Authors>Tyler Carlson</Authors>
6-
<TargetFrameworks>netstandard2.0;net461</TargetFrameworks>
6+
<TargetFrameworks>netstandard2.1</TargetFrameworks>
77
<AssemblyName>AutoMapper.Collection</AssemblyName>
88
<PackageId>AutoMapper.Collection</PackageId>
99
<PackageIcon>icon.png</PackageIcon>
1010
<PackageProjectUrl>https://github.com/AutoMapper/Automapper.Collection</PackageProjectUrl>
11-
<PackageTargetFallback Condition=" '$(TargetFramework)' == 'netstandard1.1' ">$(PackageTargetFallback);portable-net45+win8+dnxcore50;portable-net45+win8</PackageTargetFallback>
1211
<AssemblyOriginatorKeyFile>../Key.snk</AssemblyOriginatorKeyFile>
1312
<ContinuousIntegrationBuild Condition="'$(GITHUB_ACTIONS)' == 'true'">true</ContinuousIntegrationBuild>
1413
<PackageLicenseExpression>MIT</PackageLicenseExpression>
@@ -25,7 +24,7 @@
2524
</ItemGroup>
2625

2726
<ItemGroup>
28-
<PackageReference Include="AutoMapper" Version="[10.0.0, 11.0.0)" />
27+
<PackageReference Include="AutoMapper" Version="[11.0.0, 12.0.0)" />
2928
<PackageReference Include="MinVer" Version="2.3.1">
3029
<PrivateAssets>all</PrivateAssets>
3130
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

src/AutoMapper.Collection/Configuration/GeneratePropertyMapsExpressionFeature.cs

+10-1
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,29 @@
44
using AutoMapper.Collection.Runtime;
55
using AutoMapper.EquivalencyExpression;
66
using AutoMapper.Features;
7+
using AutoMapper.Internal;
8+
using AutoMapper.Mappers;
79

810
namespace AutoMapper.Collection.Configuration
911
{
1012
public class GeneratePropertyMapsExpressionFeature : IGlobalFeature
1113
{
14+
private readonly ObjectToEquivalencyExpressionByEquivalencyExistingMapper _mapper;
1215
private readonly List<Func<Func<Type, object>, IGeneratePropertyMaps>> _generators = new List<Func<Func<Type, object>, IGeneratePropertyMaps>>();
1316

17+
public GeneratePropertyMapsExpressionFeature(ObjectToEquivalencyExpressionByEquivalencyExistingMapper mapper)
18+
{
19+
_mapper = mapper;
20+
}
21+
1422
public void Add(Func<Func<Type, object>, IGeneratePropertyMaps> creator)
1523
{
1624
_generators.Add(creator);
1725
}
1826

19-
void IGlobalFeature.Configure(IConfigurationProvider configurationProvider)
27+
void IGlobalFeature.Configure(IGlobalConfiguration configurationProvider)
2028
{
29+
_mapper.Configuration = configurationProvider;
2130
var generators = _generators
2231
.Select(x => x.Invoke(configurationProvider.ServiceCtor))
2332
.ToList();

src/AutoMapper.Collection/EquivalencyExpression/EquivalentExpressions.cs

+17-21
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
using System.Linq.Expressions;
44
using AutoMapper.Collection.Configuration;
55
using AutoMapper.Collection.Runtime;
6+
using AutoMapper.Internal;
7+
using AutoMapper.Internal.Mappers;
68
using AutoMapper.Mappers;
79

810
namespace AutoMapper.EquivalencyExpression
@@ -11,52 +13,46 @@ public static class EquivalentExpressions
1113
{
1214
public static void AddCollectionMappers(this IMapperConfigurationExpression cfg)
1315
{
14-
cfg.Features.Set(new GeneratePropertyMapsExpressionFeature());
15-
cfg.InsertBefore<ReadOnlyCollectionMapper>(
16-
new ObjectToEquivalencyExpressionByEquivalencyExistingMapper(),
16+
var mapper = new ObjectToEquivalencyExpressionByEquivalencyExistingMapper();
17+
cfg.Internal().Features.Set(new GeneratePropertyMapsExpressionFeature(mapper));
18+
cfg.Internal().InsertBefore<CollectionMapper>(
19+
mapper,
1720
new EquivalentExpressionAddRemoveCollectionMapper());
1821
}
1922

20-
private static void InsertBefore<TObjectMapper>(this IMapperConfigurationExpression cfg, params IConfigurationObjectMapper[] adds)
23+
private static void InsertBefore<TObjectMapper>(this IMapperConfigurationExpression cfg, params IObjectMapper[] adds)
2124
where TObjectMapper : IObjectMapper
2225
{
23-
var mappers = cfg.Mappers;
26+
var mappers = cfg.Internal().Mappers;
2427
var targetMapper = mappers.FirstOrDefault(om => om is TObjectMapper);
2528
var index = targetMapper == null ? 0 : mappers.IndexOf(targetMapper);
2629
foreach (var mapper in adds.Reverse())
2730
{
2831
mappers.Insert(index, mapper);
2932
}
30-
31-
cfg.Advanced.BeforeSeal(c =>
32-
{
33-
foreach (var configurationObjectMapper in adds)
34-
{
35-
configurationObjectMapper.ConfigurationProvider = c;
36-
}
37-
});
3833
}
3934

40-
internal static IEquivalentComparer GetEquivalentExpression(this IConfigurationObjectMapper mapper, Type sourceType, Type destinationType)
35+
internal static IEquivalentComparer GetEquivalentExpression(this IObjectMapper mapper, Type sourceType,
36+
Type destinationType, IConfigurationProvider configuration)
4137
{
42-
var typeMap = mapper.ConfigurationProvider.ResolveTypeMap(sourceType, destinationType);
38+
var typeMap = configuration.Internal().ResolveTypeMap(sourceType, destinationType);
4339
if (typeMap == null)
4440
{
4541
return null;
4642
}
4743

48-
var comparer = GetEquivalentExpression(mapper.ConfigurationProvider, typeMap);
44+
var comparer = GetEquivalentExpression(configuration, typeMap);
4945
if (comparer == null)
5046
{
5147
foreach (var item in typeMap.IncludedBaseTypes)
5248
{
53-
var baseTypeMap = mapper.ConfigurationProvider.ResolveTypeMap(item.SourceType, item.DestinationType);
49+
var baseTypeMap = configuration.Internal().ResolveTypeMap(item.SourceType, item.DestinationType);
5450
if (baseTypeMap == null)
5551
{
5652
continue;
5753
}
5854

59-
comparer = GetEquivalentExpression(mapper.ConfigurationProvider, baseTypeMap);
55+
comparer = GetEquivalentExpression(configuration, baseTypeMap);
6056
if (comparer != null)
6157
{
6258
break;
@@ -69,7 +65,7 @@ internal static IEquivalentComparer GetEquivalentExpression(this IConfigurationO
6965
internal static IEquivalentComparer GetEquivalentExpression(IConfigurationProvider configurationProvider, TypeMap typeMap)
7066
{
7167
return typeMap.Features.Get<CollectionMappingFeature>()?.EquivalentComparer
72-
?? configurationProvider.Features.Get<GeneratePropertyMapsFeature>().Get(typeMap);
68+
?? configurationProvider.Internal().Features.Get<GeneratePropertyMapsFeature>().Get(typeMap);
7369
}
7470

7571
/// <summary>
@@ -89,14 +85,14 @@ public static IMappingExpression<TSource, TDestination> EqualityComparison<TSour
8985
public static void SetGeneratePropertyMaps<TGeneratePropertyMaps>(this IMapperConfigurationExpression cfg)
9086
where TGeneratePropertyMaps : IGeneratePropertyMaps
9187
{
92-
(cfg.Features.Get<GeneratePropertyMapsExpressionFeature>()
88+
(cfg.Internal().Features.Get<GeneratePropertyMapsExpressionFeature>()
9389
?? throw new ArgumentException("Invoke the IMapperConfigurationExpression.AddCollectionMappers() before adding IGeneratePropertyMaps."))
9490
.Add(serviceCtor => (IGeneratePropertyMaps)serviceCtor(typeof(TGeneratePropertyMaps)));
9591
}
9692

9793
public static void SetGeneratePropertyMaps(this IMapperConfigurationExpression cfg, IGeneratePropertyMaps generatePropertyMaps)
9894
{
99-
(cfg.Features.Get<GeneratePropertyMapsExpressionFeature>()
95+
(cfg.Internal().Features.Get<GeneratePropertyMapsExpressionFeature>()
10096
?? throw new ArgumentException("Invoke the IMapperConfigurationExpression.AddCollectionMappers() before adding IGeneratePropertyMaps."))
10197
.Add(_ => generatePropertyMaps);
10298
}

src/AutoMapper.Collection/Mappers/EquivalentExpressionAddRemoveCollectionMapper.cs

+12-12
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,17 @@
55
using System.Reflection;
66
using AutoMapper.Collection;
77
using AutoMapper.EquivalencyExpression;
8+
using AutoMapper.Internal;
9+
using AutoMapper.Internal.Mappers;
810
using static System.Linq.Expressions.Expression;
11+
using static AutoMapper.Execution.ExpressionBuilder;
912

1013
namespace AutoMapper.Mappers
1114
{
12-
public class EquivalentExpressionAddRemoveCollectionMapper : EnumerableMapperBase, IConfigurationObjectMapper
15+
public class EquivalentExpressionAddRemoveCollectionMapper : IObjectMapper
1316
{
1417
private readonly CollectionMapper _collectionMapper = new CollectionMapper();
1518

16-
public IConfigurationProvider ConfigurationProvider { get; set; }
17-
1819
public static TDestination Map<TSource, TSourceItem, TDestination, TDestinationItem>(TSource source, TDestination destination, ResolutionContext context, IEquivalentComparer equivalentComparer)
1920
where TSource : IEnumerable<TSourceItem>
2021
where TDestination : ICollection<TDestinationItem>
@@ -31,8 +32,7 @@ public static TDestination Map<TSource, TSourceItem, TDestination, TDestinationI
3132
var sourceHash = equivalentComparer.GetHashCode(x);
3233

3334
var item = default(TDestinationItem);
34-
List<TDestinationItem> itemList;
35-
if (destList.TryGetValue(sourceHash, out itemList))
35+
if (destList.TryGetValue(sourceHash, out var itemList))
3636
{
3737
item = itemList.FirstOrDefault(dest => equivalentComparer.IsEquivalent(x, dest));
3838
if (item != null)
@@ -66,19 +66,19 @@ public static TDestination Map<TSource, TSourceItem, TDestination, TDestinationI
6666
private static readonly MethodInfo _mapMethodInfo = typeof(EquivalentExpressionAddRemoveCollectionMapper).GetRuntimeMethods().Single(x => x.IsStatic && x.Name == nameof(Map));
6767
private static readonly ConcurrentDictionary<TypePair, IObjectMapper> _objectMapperCache = new ConcurrentDictionary<TypePair, IObjectMapper>();
6868

69-
public override bool IsMatch(TypePair typePair)
69+
public bool IsMatch(TypePair typePair)
7070
{
7171
return typePair.SourceType.IsEnumerableType()
7272
&& typePair.DestinationType.IsCollectionType();
7373
}
7474

75-
public override Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap, IMemberMap memberMap,
76-
Expression sourceExpression, Expression destExpression, Expression contextExpression)
75+
public Expression MapExpression(IGlobalConfiguration configurationProvider, ProfileMap profileMap, MemberMap memberMap,
76+
Expression sourceExpression, Expression destExpression)
7777
{
7878
var sourceType = TypeHelper.GetElementType(sourceExpression.Type);
7979
var destType = TypeHelper.GetElementType(destExpression.Type);
8080

81-
var equivalencyExpression = this.GetEquivalentExpression(sourceType, destType);
81+
var equivalencyExpression = this.GetEquivalentExpression(sourceType, destType, configurationProvider);
8282
if (equivalencyExpression == null)
8383
{
8484
var typePair = new TypePair(sourceExpression.Type, destExpression.Type);
@@ -95,14 +95,14 @@ public override Expression MapExpression(IConfigurationProvider configurationPro
9595
}
9696
return _collectionMapper;
9797
})
98-
.MapExpression(configurationProvider, profileMap, memberMap, sourceExpression, destExpression, contextExpression);
98+
.MapExpression(configurationProvider, profileMap, memberMap, sourceExpression, destExpression);
9999
}
100100

101101
var method = _mapMethodInfo.MakeGenericMethod(sourceExpression.Type, sourceType, destExpression.Type, destType);
102-
var map = Call(null, method, sourceExpression, destExpression, contextExpression, Constant(equivalencyExpression));
102+
var map = Call(null, method, sourceExpression, destExpression, ContextParameter, Constant(equivalencyExpression));
103103

104104
var notNull = NotEqual(destExpression, Constant(null));
105-
var collectionMapperExpression = _collectionMapper.MapExpression(configurationProvider, profileMap, memberMap, sourceExpression, destExpression, contextExpression);
105+
var collectionMapperExpression = _collectionMapper.MapExpression(configurationProvider, profileMap, memberMap, sourceExpression, destExpression);
106106
return Condition(notNull, map, Convert(collectionMapperExpression, destExpression.Type));
107107
}
108108
}
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
namespace AutoMapper.Mappers
2-
{
3-
public interface IConfigurationObjectMapper : IObjectMapper
4-
{
5-
IConfigurationProvider ConfigurationProvider { get; set; }
6-
}
7-
}
1+
//using AutoMapper.Internal.Mappers;
2+
3+
//namespace AutoMapper.Mappers
4+
//{
5+
// public interface IConfigurationObjectMapper : IObjectMapper
6+
// {
7+
// IConfigurationProvider ConfigurationProvider { get; set; }
8+
// }
9+
//}

0 commit comments

Comments
 (0)