Skip to content

Commit e4f44e6

Browse files
PluginManager: support injecting plugin dependencies
1 parent b01c261 commit e4f44e6

File tree

4 files changed

+49
-12
lines changed

4 files changed

+49
-12
lines changed

src/Certify.Core/Management/CertifyManager/CertifyManager.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Concurrent;
33
using System.Collections.Generic;
44
using System.IO;
@@ -100,14 +100,16 @@ public partial class CertifyManager : ICertifyManager, IDisposable
100100
private System.Timers.Timer _hourlyTimer;
101101
private System.Timers.Timer _dailyTimer;
102102

103-
public CertifyManager() : this(true)
103+
private IServiceProvider _injectedServiceProvider;
104+
public CertifyManager(IServiceProvider injectedServiceProvider) : this()
104105
{
105-
106+
_injectedServiceProvider = injectedServiceProvider;
106107
}
107108

108-
public CertifyManager(bool useWindowsNativeFeatures = true)
109+
public CertifyManager()
109110
{
110-
_useWindowsNativeFeatures = useWindowsNativeFeatures;
111+
// load setting here so that we know our instance ID etc early on. Other longer tasks are deferred until Init is called.
112+
SettingsManager.LoadAppSettings();
111113
}
112114

113115
public async Task Init()
@@ -116,13 +118,11 @@ public async Task Init()
116118

117119
_serverConfig = SharedUtils.ServiceConfigManager.GetAppServiceConfig();
118120

119-
SettingsManager.LoadAppSettings();
120-
121121
InitLogging(_serverConfig);
122122

123123
Util.SetSupportedTLSVersions();
124124

125-
_pluginManager = new PluginManager
125+
_pluginManager = new PluginManager(_injectedServiceProvider)
126126
{
127127
EnableExternalPlugins = CoreAppSettings.Current.IncludeExternalPlugins
128128
};

src/Certify.Models/Certify.Models.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
<PrivateAssets>all</PrivateAssets>
2222
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
2323
</PackageReference>
24+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.1" />
2425
<PackageReference Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.3.1" />
2526
<PackageReference Include="Microsoft.Net.Compilers.Toolset" Version="4.12.0">
2627
<PrivateAssets>all</PrivateAssets>

src/Certify.Models/Plugins/PluginProviderBase.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,25 @@
33
using System.Linq;
44
using Certify.Models.Config;
55
using Certify.Models.Plugins;
6+
using Microsoft.Extensions.DependencyInjection;
67

78
namespace Certify.Plugins
89
{
910
public class PluginProviderBase<TProviderInterface, TProviderDefinition> : IProviderPlugin<TProviderInterface, TProviderDefinition>
1011
{
1112

13+
public PluginProviderBase()
14+
{
15+
}
16+
17+
// optionally support dependency injection
18+
public PluginProviderBase(IServiceProvider serviceProvider)
19+
{
20+
_services = serviceProvider;
21+
}
22+
23+
private IServiceProvider? _services { get; }
24+
1225
public TProviderInterface GetProvider(Type pluginType, string? id)
1326
{
1427

@@ -26,7 +39,14 @@ public TProviderInterface GetProvider(Type pluginType, string? id)
2639
{
2740
if ((def as ProviderDefinition)?.Id?.ToLowerInvariant() == id)
2841
{
29-
return (TProviderInterface)Activator.CreateInstance(t);
42+
if (_services == null)
43+
{
44+
return (TProviderInterface)Activator.CreateInstance(t);
45+
}
46+
else
47+
{
48+
return (TProviderInterface)ActivatorUtilities.CreateInstance(_services, t);
49+
}
3050
}
3151
}
3252
}

src/Certify.Shared/Management/PluginManager.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Certify.Models;
88
using Certify.Models.Config;
99
using Certify.Models.Plugins;
10+
using Microsoft.Extensions.DependencyInjection;
1011
using Microsoft.Extensions.Logging;
1112
using Serilog;
1213
using Serilog.Extensions.Logging;
@@ -52,6 +53,16 @@ public class PluginManager
5253

5354
private Models.Providers.ILog _log = null;
5455

56+
private IServiceProvider _services;
57+
58+
/// <summary>
59+
///
60+
/// </summary>
61+
/// <param name="serviceProvider"></param>
62+
public PluginManager(IServiceProvider serviceProvider) : this()
63+
{
64+
_services = serviceProvider;
65+
}
5566
public PluginManager()
5667
{
5768
var serilogLogger = new LoggerConfiguration()
@@ -124,9 +135,14 @@ private T LoadPlugin<T>(string dllFileName, string pluginFolder = null)
124135

125136
if (pluginType != null)
126137
{
127-
var obj = (T)Activator.CreateInstance(pluginType);
128-
129-
return obj;
138+
if (_services == null)
139+
{
140+
return (T)Activator.CreateInstance(pluginType);
141+
}
142+
else
143+
{
144+
return (T)ActivatorUtilities.CreateInstance(_services, pluginType);
145+
}
130146
}
131147
else
132148
{

0 commit comments

Comments
 (0)