Skip to content

Commit 9559a29

Browse files
authored
Merge pull request #2 from AppCoreNet/refactor-facilities
Refactor facilities and extensions
2 parents befb96d + 5606be1 commit 9559a29

File tree

44 files changed

+916
-387
lines changed

Some content is hidden

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

44 files changed

+916
-387
lines changed

AppCore.Extensions.sln

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ EndProject
4444
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppCore.Extensions.Hosting.Plugins.TestPlugin2", "Hosting\test\AppCore.Extensions.Hosting.Plugins.TestPlugin2\AppCore.Extensions.Hosting.Plugins.TestPlugin2.csproj", "{C74E308B-B96F-473F-AE4B-6117FDBACF4E}"
4545
EndProject
4646
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Http", "Http", "{9416DF99-18D3-4373-A517-00A65E7CC32A}"
47+
ProjectSection(SolutionItems) = preProject
48+
Http\README.md = Http\README.md
49+
EndProjectSection
4750
EndProject
4851
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{B2F9DC67-6D7B-4070-8580-F401050445A9}"
4952
EndProject

DependencyInjection/src/AppCore.Extensions.DependencyInjection.Abstractions/Facilities/Facility.cs

Lines changed: 0 additions & 134 deletions
This file was deleted.
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
// Licensed under the MIT License.
2+
// Copyright (c) 2018-2022 the AppCore .NET project.
3+
4+
using System;
5+
using AppCore.Diagnostics;
6+
using AppCore.Extensions.DependencyInjection.Activator;
7+
using Microsoft.Extensions.DependencyInjection;
8+
9+
namespace AppCore.Extensions.DependencyInjection.Facilities;
10+
11+
/// <summary>
12+
/// Provides a builder for facilities.
13+
/// </summary>
14+
public class FacilityBuilder
15+
{
16+
/// <summary>
17+
/// Gets the <see cref="IServiceCollection"/>.
18+
/// </summary>
19+
public IServiceCollection Services { get; }
20+
21+
/// <summary>
22+
/// Gets the <see cref="IActivator"/>.
23+
/// </summary>
24+
public IActivator Activator { get; }
25+
26+
/// <summary>
27+
/// Gets the type of the facility.
28+
/// </summary>
29+
public Type FacilityType { get; }
30+
31+
internal FacilityBuilder(IServiceCollection services, IActivator activator, Type facilityType)
32+
{
33+
Services = services;
34+
Activator = activator;
35+
FacilityType = facilityType;
36+
}
37+
38+
/// <summary>
39+
/// Adds an extension to the facility.
40+
/// </summary>
41+
/// <remarks>
42+
/// The type <paramref name="extensionType"/> must implement <see cref="IFacilityExtension{T}"/> with the
43+
/// type of the facility.
44+
/// </remarks>
45+
/// <param name="extensionType">The type of the extension.</param>
46+
/// <returns>The <see cref="FacilityBuilder"/> to allow chaining.</returns>
47+
public FacilityBuilder AddExtension(Type extensionType)
48+
{
49+
Ensure.Arg.NotNull(extensionType);
50+
Ensure.Arg.OfType(extensionType, typeof(IFacilityExtension<>).MakeGenericType(FacilityType));
51+
52+
var extension = (IFacilityExtension<IFacility>)Activator.CreateInstance(extensionType);
53+
extension.ConfigureServices(Services);
54+
return this;
55+
}
56+
57+
/// <summary>
58+
/// Adds facility extensions using a <see cref="IFacilityExtensionReflectionBuilder"/> to the <see cref="IServiceCollection"/>.
59+
/// </summary>
60+
/// <param name="configure">The delegate used to configure the facility extension resolvers.</param>
61+
/// <returns>The <see cref="FacilityBuilder"/>.</returns>
62+
public FacilityBuilder AddExtensionsFrom(Action<IFacilityExtensionReflectionBuilder> configure)
63+
{
64+
Ensure.Arg.NotNull(configure);
65+
66+
var reflectionBuilder = new FacilityExtensionReflectionBuilder(Activator);
67+
configure(reflectionBuilder);
68+
69+
foreach (IFacilityExtension<IFacility> extension in reflectionBuilder.Resolve(FacilityType))
70+
{
71+
extension.ConfigureServices(Services);
72+
}
73+
74+
return this;
75+
}
76+
}
77+
78+
/// <summary>
79+
/// Provides a builder for facilities.
80+
/// </summary>
81+
public sealed class FacilityBuilder<T> : FacilityBuilder
82+
where T : IFacility
83+
{
84+
internal FacilityBuilder(IServiceCollection services, IActivator activator)
85+
: base(services, activator, typeof(T))
86+
{
87+
}
88+
89+
/// <summary>
90+
/// Adds an extension to the facility.
91+
/// </summary>
92+
/// <remarks>
93+
/// The type <paramref name="extensionType"/> must implement <see cref="IFacilityExtension{T}"/> with the
94+
/// type of the facility.
95+
/// </remarks>
96+
/// <param name="extensionType">The type of the extension.</param>
97+
/// <returns>The <see cref="FacilityBuilder{T}"/> to allow chaining.</returns>
98+
public new FacilityBuilder<T> AddExtension(Type extensionType)
99+
{
100+
base.AddExtension(extensionType);
101+
return this;
102+
}
103+
104+
/// <summary>
105+
/// Adds an extension to the facility.
106+
/// </summary>
107+
/// <typeparam name="TExtension">The type of the extension.</typeparam>
108+
/// <returns>The <see cref="FacilityBuilder{T}"/> to allow chaining.</returns>
109+
public FacilityBuilder<T> AddExtension<TExtension>()
110+
where TExtension : IFacilityExtension<T>
111+
{
112+
var extension = (IFacilityExtension<IFacility>)Activator.CreateInstance(typeof(TExtension));
113+
extension.ConfigureServices(Services);
114+
return this;
115+
}
116+
117+
/// <summary>
118+
/// Adds an extension to the facility.
119+
/// </summary>
120+
/// <returns>The <see cref="FacilityBuilder{T}"/> to allow chaining.</returns>
121+
public FacilityBuilder<T> AddExtension(IFacilityExtension<T> extension)
122+
{
123+
Ensure.Arg.NotNull(extension);
124+
extension.ConfigureServices(Services);
125+
return this;
126+
}
127+
128+
/// <summary>
129+
/// Adds facility extensions using a <see cref="IFacilityExtensionReflectionBuilder"/> to the <see cref="IServiceCollection"/>.
130+
/// </summary>
131+
/// <param name="configure">The delegate used to configure the facility extension resolvers.</param>
132+
/// <returns>The <see cref="FacilityBuilder{T}"/>.</returns>
133+
public new FacilityBuilder<T> AddExtensionsFrom(Action<IFacilityExtensionReflectionBuilder> configure)
134+
{
135+
base.AddExtensionsFrom(configure);
136+
return this;
137+
}
138+
}

DependencyInjection/src/AppCore.Extensions.DependencyInjection.Abstractions/Facilities/FacilityExtension.cs

Lines changed: 0 additions & 46 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// Licensed under the MIT License.
2+
// Copyright (c) 2018-2022 the AppCore .NET project.
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Linq;
7+
using AppCore.Diagnostics;
8+
using AppCore.Extensions.DependencyInjection.Activator;
9+
10+
namespace AppCore.Extensions.DependencyInjection.Facilities;
11+
12+
internal sealed class FacilityExtensionReflectionBuilder : IFacilityExtensionReflectionBuilder
13+
{
14+
private readonly IActivator _activator;
15+
private readonly List<IFacilityExtensionResolver> _resolvers = new();
16+
17+
public FacilityExtensionReflectionBuilder(IActivator activator)
18+
{
19+
_activator = activator;
20+
}
21+
22+
public IFacilityExtensionReflectionBuilder AddResolver(IFacilityExtensionResolver resolver)
23+
{
24+
Ensure.Arg.NotNull(resolver);
25+
_resolvers.Add(resolver);
26+
return this;
27+
}
28+
29+
public IFacilityExtensionReflectionBuilder AddResolver<T>(Action<T>? configure = null)
30+
where T : IFacilityExtensionResolver
31+
{
32+
var resolver = _activator.CreateInstance<T>();
33+
configure?.Invoke(resolver);
34+
return AddResolver(resolver);
35+
}
36+
37+
public IReadOnlyCollection<IFacilityExtension<IFacility>> Resolve(Type facilityType)
38+
{
39+
return _resolvers.SelectMany(s => s.Resolve(facilityType))
40+
.ToList()
41+
.AsReadOnly();
42+
}
43+
}

0 commit comments

Comments
 (0)