Skip to content

Commit b2226f4

Browse files
authored
Merge pull request #18 from AppCoreNet/aot-compat
Add AOT compatibility.
2 parents 8ae159f + dd0f250 commit b2226f4

File tree

91 files changed

+623
-462
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

91 files changed

+623
-462
lines changed

AppCoreNet.Extensions.sln

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
109109
stylecop.json = stylecop.json
110110
Directory.Packages.props = Directory.Packages.props
111111
NuGet.config = NuGet.config
112+
renovate.json = renovate.json
112113
EndProjectSection
113114
EndProject
114115
Global

DependencyInjection/src/AppCoreNet.Extensions.DependencyInjection.Abstractions/Activator/ActivatorExtensions.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Copyright (c) The AppCore .NET project.
33

44
using System;
5+
using System.Diagnostics.CodeAnalysis;
56
using AppCoreNet.Diagnostics;
67

78
namespace AppCoreNet.Extensions.DependencyInjection.Activator;
@@ -19,7 +20,9 @@ public static class ActivatorExtensions
1920
/// <param name="parameters">Constructor arguments not provided by the <see cref="IServiceProvider"/>.</param>
2021
/// <returns>An activated object of type <typeparamref name="T"/>.</returns>
2122
/// <exception cref="ArgumentNullException">Argument <paramref name="activator"/> is null.</exception>
22-
public static T? CreateInstance<T>(this IActivator activator, params object[] parameters)
23+
public static T? CreateInstance<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T>(
24+
this IActivator activator,
25+
params object[] parameters)
2326
{
2427
Ensure.Arg.NotNull(activator);
2528
return (T?)activator.CreateInstance(typeof(T), parameters);

DependencyInjection/src/AppCoreNet.Extensions.DependencyInjection.Abstractions/Activator/DefaultActivator.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Copyright (c) The AppCore .NET project.
33

44
using System;
5+
using System.Diagnostics.CodeAnalysis;
56
using AppCoreNet.Diagnostics;
67

78
namespace AppCoreNet.Extensions.DependencyInjection.Activator;
@@ -17,7 +18,9 @@ public sealed class DefaultActivator : IActivator
1718
public static DefaultActivator Instance { get; } = new();
1819

1920
/// <inheritdoc />
20-
public object? CreateInstance(Type instanceType, params object[] parameters)
21+
public object? CreateInstance(
22+
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type instanceType,
23+
params object[] parameters)
2124
{
2225
Ensure.Arg.NotNull(instanceType);
2326
Ensure.Arg.NotNull(parameters);

DependencyInjection/src/AppCoreNet.Extensions.DependencyInjection.Abstractions/Activator/IActivator.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Copyright (c) The AppCore .NET project.
33

44
using System;
5+
using System.Diagnostics.CodeAnalysis;
56

67
namespace AppCoreNet.Extensions.DependencyInjection.Activator;
78

@@ -17,5 +18,7 @@ public interface IActivator
1718
/// <param name="parameters">Constructor arguments not provided by the <see cref="IServiceProvider"/>.</param>
1819
/// <returns>An activated object of type <paramref name="instanceType"/>.</returns>
1920
/// <exception cref="ArgumentNullException">Argument <paramref name="instanceType"/> or <paramref name="parameters"/> is null.</exception>
20-
object? CreateInstance(Type instanceType, params object[] parameters);
21+
object? CreateInstance(
22+
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type instanceType,
23+
params object[] parameters);
2124
}

DependencyInjection/src/AppCoreNet.Extensions.DependencyInjection.Abstractions/Activator/ServiceProviderActivator.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Copyright (c) The AppCore .NET project.
33

44
using System;
5+
using System.Diagnostics.CodeAnalysis;
56
using AppCoreNet.Diagnostics;
67
using Microsoft.Extensions.DependencyInjection;
78

@@ -26,7 +27,9 @@ public ServiceProviderActivator(IServiceProvider serviceProvider)
2627
}
2728

2829
/// <inheritdoc />
29-
public object? CreateInstance(Type instanceType, params object[] parameters)
30+
public object? CreateInstance(
31+
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type instanceType,
32+
params object[] parameters)
3033
{
3134
return ActivatorUtilities.CreateInstance(_serviceProvider, instanceType, parameters);
3235
}

DependencyInjection/src/AppCoreNet.Extensions.DependencyInjection.Abstractions/AppCoreNet.Extensions.DependencyInjection.Abstractions.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<TargetFrameworks>net8.0;netstandard2.0;net462</TargetFrameworks>
55
<RootNamespace>AppCoreNet.Extensions.DependencyInjection</RootNamespace>
66
<Description>Provides extensions to the Microsoft.Extensions.DependencyInjection framework.</Description>
7+
<IsAotCompatible Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net8.0'))">true</IsAotCompatible>
78
</PropertyGroup>
89

910
<ItemGroup>

DependencyInjection/src/AppCoreNet.Extensions.DependencyInjection.Abstractions/Facilities/FacilityBuilder.cs

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// Copyright (c) The AppCore .NET project.
33

44
using System;
5-
using System.Linq;
5+
using System.Diagnostics.CodeAnalysis;
66
using AppCoreNet.Diagnostics;
77
using AppCoreNet.Extensions.DependencyInjection.Activator;
88
using Microsoft.Extensions.DependencyInjection;
@@ -12,7 +12,7 @@ namespace AppCoreNet.Extensions.DependencyInjection.Facilities;
1212
/// <summary>
1313
/// Provides a builder for facilities.
1414
/// </summary>
15-
public class FacilityBuilder
15+
public sealed class FacilityBuilder
1616
{
1717
/// <summary>
1818
/// Gets the <see cref="IServiceCollection"/>.
@@ -36,35 +36,23 @@ internal FacilityBuilder(IServiceCollection services, IActivator activator, Type
3636
FacilityType = facilityType;
3737
}
3838

39-
private IFacilityExtension<IFacility> CreateExtension(Type extensionType)
40-
{
41-
Type contractType = extensionType.GetInterfaces()
42-
.First(i => i.GetGenericTypeDefinition() == typeof(IFacilityExtension<>))
43-
.GenericTypeArguments[0];
44-
45-
Type extensionWrapperType = typeof(FacilityExtensionWrapper<>).MakeGenericType(contractType);
46-
object extension = Activator.CreateInstance(extensionType)!;
47-
48-
return (IFacilityExtension<IFacility>)System.Activator.CreateInstance(extensionWrapperType, extension)!;
49-
}
50-
5139
/// <summary>
5240
/// Adds an extension to the facility.
5341
/// </summary>
5442
/// <remarks>
55-
/// The type <paramref name="extensionType"/> must implement <see cref="IFacilityExtension{T}"/> with the
56-
/// type of the facility.
43+
/// The type <paramref name="extensionType"/> must implement <see cref="IFacilityExtension"/>.
5744
/// </remarks>
5845
/// <param name="extensionType">The type of the extension.</param>
5946
/// <returns>The <see cref="FacilityBuilder"/> to allow chaining.</returns>
6047
/// <exception cref="ArgumentNullException">Argument <paramref name="extensionType"/> is null.</exception>
61-
/// <exception cref="ArgumentException">Argument <paramref name="extensionType"/> does not implement <see cref="IFacilityExtension{T}"/> with the type of the facility.</exception>
62-
public FacilityBuilder AddExtension(Type extensionType)
48+
/// <exception cref="ArgumentException">Argument <paramref name="extensionType"/> does not implement <see cref="IFacilityExtension"/> with the type of the facility.</exception>
49+
public FacilityBuilder AddExtension(
50+
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type extensionType)
6351
{
6452
Ensure.Arg.NotNull(extensionType);
65-
Ensure.Arg.OfType(extensionType, typeof(IFacilityExtension<>).MakeGenericType(FacilityType));
53+
Ensure.Arg.OfType<IFacilityExtension>(extensionType);
6654

67-
IFacilityExtension<IFacility> extension = CreateExtension(extensionType);
55+
var extension = (IFacilityExtension)Activator.CreateInstance(extensionType)!;
6856
extension.ConfigureServices(Services);
6957
return this;
7058
}
@@ -82,7 +70,7 @@ public FacilityBuilder AddExtensionsFrom(Action<IFacilityExtensionReflectionBuil
8270
var reflectionBuilder = new FacilityExtensionReflectionBuilder(Activator);
8371
configure(reflectionBuilder);
8472

85-
foreach (IFacilityExtension<IFacility> extension in reflectionBuilder.Resolve(FacilityType))
73+
foreach (IFacilityExtension extension in reflectionBuilder.Resolve(FacilityType))
8674
{
8775
extension.ConfigureServices(Services);
8876
}

DependencyInjection/src/AppCoreNet.Extensions.DependencyInjection.Abstractions/Facilities/FacilityBuilder{T}.cs

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// Copyright (c) The AppCore .NET project.
33

44
using System;
5-
using System.Linq;
5+
using System.Diagnostics.CodeAnalysis;
66
using AppCoreNet.Diagnostics;
77
using AppCoreNet.Extensions.DependencyInjection.Activator;
88
using Microsoft.Extensions.DependencyInjection;
@@ -13,12 +13,23 @@ namespace AppCoreNet.Extensions.DependencyInjection.Facilities;
1313
/// Provides a builder for facilities.
1414
/// </summary>
1515
/// <typeparam name="T">The type of the facility.</typeparam>
16-
public sealed class FacilityBuilder<T> : FacilityBuilder
16+
public sealed class FacilityBuilder<T>
1717
where T : IFacility
1818
{
19+
/// <summary>
20+
/// Gets the <see cref="IServiceCollection"/>.
21+
/// </summary>
22+
public IServiceCollection Services { get; }
23+
24+
/// <summary>
25+
/// Gets the <see cref="IActivator"/>.
26+
/// </summary>
27+
public IActivator Activator { get; }
28+
1929
internal FacilityBuilder(IServiceCollection services, IActivator activator)
20-
: base(services, activator, typeof(T))
2130
{
31+
Services = services;
32+
Activator = activator;
2233
}
2334

2435
/// <summary>
@@ -32,9 +43,13 @@ internal FacilityBuilder(IServiceCollection services, IActivator activator)
3243
/// <returns>The <see cref="FacilityBuilder{T}"/> to allow chaining.</returns>
3344
/// <exception cref="ArgumentNullException">Argument <paramref name="extensionType"/> is null.</exception>
3445
/// <exception cref="ArgumentException">Argument <paramref name="extensionType"/> does not implement <see cref="IFacilityExtension{T}"/> with the type of the facility.</exception>
35-
public new FacilityBuilder<T> AddExtension(Type extensionType)
46+
public FacilityBuilder<T> AddExtension(
47+
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type extensionType)
3648
{
37-
base.AddExtension(extensionType);
49+
Ensure.Arg.OfType<IFacilityExtension<T>>(extensionType);
50+
51+
var extension = (IFacilityExtension<T>)Activator.CreateInstance(extensionType)!;
52+
extension.ConfigureServices(Services);
3853
return this;
3954
}
4055

@@ -43,7 +58,8 @@ internal FacilityBuilder(IServiceCollection services, IActivator activator)
4358
/// </summary>
4459
/// <typeparam name="TExtension">The type of the extension.</typeparam>
4560
/// <returns>The <see cref="FacilityBuilder{T}"/> to allow chaining.</returns>
46-
public FacilityBuilder<T> AddExtension<TExtension>()
61+
public FacilityBuilder<T> AddExtension<
62+
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TExtension>()
4763
where TExtension : class, IFacilityExtension<T>
4864
{
4965
IFacilityExtension<T> extension = Activator.CreateInstance<TExtension>()!;
@@ -65,14 +81,24 @@ public FacilityBuilder<T> AddExtension(IFacilityExtension<T> extension)
6581
}
6682

6783
/// <summary>
68-
/// Adds facility extensions using a <see cref="IFacilityExtensionReflectionBuilder"/> to the <see cref="IServiceCollection"/>.
84+
/// Adds facility extensions using a <see cref="IFacilityExtensionReflectionBuilder"/> to the
85+
/// <see cref="IServiceCollection"/>.
6986
/// </summary>
7087
/// <param name="configure">The delegate used to configure the facility extension resolvers.</param>
7188
/// <returns>The <see cref="FacilityBuilder{T}"/>.</returns>
7289
/// <exception cref="ArgumentNullException">Argument <paramref name="configure"/> is null.</exception>
73-
public new FacilityBuilder<T> AddExtensionsFrom(Action<IFacilityExtensionReflectionBuilder> configure)
90+
public FacilityBuilder<T> AddExtensionsFrom(Action<IFacilityExtensionReflectionBuilder> configure)
7491
{
75-
base.AddExtensionsFrom(configure);
92+
Ensure.Arg.NotNull(configure);
93+
94+
var reflectionBuilder = new FacilityExtensionReflectionBuilder(Activator);
95+
configure(reflectionBuilder);
96+
97+
foreach (IFacilityExtension extension in reflectionBuilder.Resolve(typeof(T)))
98+
{
99+
extension.ConfigureServices(Services);
100+
}
101+
76102
return this;
77103
}
78104
}

DependencyInjection/src/AppCoreNet.Extensions.DependencyInjection.Abstractions/Facilities/FacilityExtensionReflectionBuilder.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using System.Diagnostics.CodeAnalysis;
67
using System.Linq;
78
using AppCoreNet.Diagnostics;
89
using AppCoreNet.Extensions.DependencyInjection.Activator;
@@ -26,21 +27,18 @@ public IFacilityExtensionReflectionBuilder AddResolver(IFacilityExtensionResolve
2627
return this;
2728
}
2829

29-
public IFacilityExtensionReflectionBuilder AddResolver<T>(Action<T>? configure = null)
30+
public IFacilityExtensionReflectionBuilder AddResolver<
31+
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T>(Action<T>? configure = null)
3032
where T : IFacilityExtensionResolver
3133
{
3234
var resolver = _activator.CreateInstance<T>()!;
3335
configure?.Invoke(resolver);
3436
return AddResolver(resolver);
3537
}
3638

37-
public IReadOnlyCollection<IFacilityExtension<IFacility>> Resolve(Type facilityType)
39+
public IReadOnlyCollection<IFacilityExtension> Resolve(Type facilityType)
3840
{
39-
Type[] facilityTypes = facilityType.GetTypesAssignableFrom()
40-
.Where(t => t.GetInterfaces().Contains(typeof(IFacility)))
41-
.ToArray();
42-
43-
return _resolvers.SelectMany(s => facilityTypes.SelectMany(s.Resolve))
41+
return _resolvers.SelectMany(s => s.Resolve(facilityType))
4442
.ToList()
4543
.AsReadOnly();
4644
}

DependencyInjection/src/AppCoreNet.Extensions.DependencyInjection.Abstractions/Facilities/FacilityExtensionWrapper.cs

Lines changed: 0 additions & 22 deletions
This file was deleted.

0 commit comments

Comments
 (0)