Skip to content

Commit 269eb82

Browse files
committed
Added 'Enabled' property to 'PluginOptions' to support different plugin configuration strategies.
1 parent 5da66c1 commit 269eb82

File tree

5 files changed

+99
-2
lines changed

5 files changed

+99
-2
lines changed

Hosting/src/AppCoreNet.Extensions.Hosting.Plugins/PluginManager.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,21 @@ private List<Plugin> LoadPluginsCore(HashSet<string> loadedPlugins)
146146

147147
private IEnumerable<(string assemblyName, PluginLoader loader)> GetPluginLoaders(HashSet<string> loadedPlugins)
148148
{
149+
_options.Enabled.TryGetValue("*", out bool allPluginsEnabled);
150+
151+
bool IsPluginEnabled(string pluginName)
152+
{
153+
#pragma warning disable CS0612 // Type or member is obsolete
154+
if (_options.Disabled.Contains(pluginName, StringComparer.OrdinalIgnoreCase))
155+
#pragma warning restore CS0612 // Type or member is obsolete
156+
return false;
157+
158+
if (!_options.Enabled.TryGetValue(pluginName, out bool enabled))
159+
enabled = allPluginsEnabled;
160+
161+
return enabled;
162+
}
163+
149164
PluginLoader? GetPluginLoader(string assemblyPath)
150165
{
151166
if (!File.Exists(assemblyPath))
@@ -155,7 +170,8 @@ private List<Plugin> LoadPluginsCore(HashSet<string> loadedPlugins)
155170
}
156171

157172
string pluginName = Path.GetFileNameWithoutExtension(assemblyPath);
158-
if (_options.Disabled.Contains(pluginName, StringComparer.OrdinalIgnoreCase))
173+
174+
if (!IsPluginEnabled(pluginName))
159175
return null;
160176

161177
return PluginLoader.CreateFromAssemblyFile(assemblyPath, ConfigurePlugin);

Hosting/src/AppCoreNet.Extensions.Hosting.Plugins/PluginOptions.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,19 @@ public class PluginOptions
4141
public IList<string> Assemblies { get; } = new List<string>();
4242

4343
/// <summary>
44-
/// Gets the list of disabled plugins.
44+
/// Gets the dictionary of disabled plugins.
4545
/// </summary>
4646
/// <remarks>
4747
/// Entries must have the name of the plugin assembly (excluding the path and extension).
4848
/// </remarks>
49+
[Obsolete]
4950
public IList<string> Disabled { get; } = new List<string>();
51+
52+
/// <summary>
53+
/// Gets the dictionary of enabled plugins.
54+
/// </summary>
55+
/// <remarks>
56+
/// Entries must have the name of the plugin assembly (excluding the path and extension).
57+
/// </remarks>
58+
public IDictionary<string, bool> Enabled { get; } = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase);
5059
}

Hosting/test/AppCoreNet.Extensions.Hosting.Plugins.Tests/PluginFacilityResolverTests.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public void RegistersFacilitiesWithExtensions()
2727
{
2828
o.Assemblies.Add(PluginPaths.TestPlugin);
2929
o.Assemblies.Add(PluginPaths.TestPlugin2);
30+
o.Enabled["*"] = true;
3031
});
3132

3233
services.AddFacilitiesFrom(
@@ -66,6 +67,7 @@ public void RegistersFacilities()
6667
{
6768
o.Assemblies.Add(PluginPaths.TestPlugin);
6869
o.Assemblies.Add(PluginPaths.TestPlugin2);
70+
o.Enabled["*"] = true;
6971
});
7072

7173
services.AddFacilitiesFrom(s => s.Plugins());
@@ -91,6 +93,7 @@ public void RegistersFacilityWithServices()
9193
o =>
9294
{
9395
o.Assemblies.Add(PluginPaths.TestPlugin);
96+
o.Enabled["*"] = true;
9497
});
9598

9699
services.AddFacilitiesFrom(s => s.Plugins());

Hosting/test/AppCoreNet.Extensions.Hosting.Plugins.Tests/PluginManagerTests.cs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public void ResolveAllPublicInstancesFromPlugins()
2222
var pluginOptions = new PluginOptions
2323
{
2424
Assemblies = { PluginPaths.TestPlugin, PluginPaths.TestPlugin2 },
25+
Enabled = { { "*", true } },
2526
};
2627

2728
var manager = new PluginManager(new DefaultActivator(), Options.Create(pluginOptions));
@@ -48,6 +49,7 @@ public void ResolveAllInstancesFromPlugins()
4849
{
4950
ResolvePrivateTypes = true,
5051
Assemblies = { PluginPaths.TestPlugin, PluginPaths.TestPlugin2 },
52+
Enabled = { { "*", true } },
5153
};
5254

5355
var manager = new PluginManager(new DefaultActivator(), Options.Create(pluginOptions));
@@ -80,6 +82,7 @@ public void GetAllPlugins()
8082
var options = new PluginOptions();
8183
options.Assemblies.Add(PluginPaths.TestPlugin);
8284
options.Assemblies.Add(PluginPaths.TestPlugin2);
85+
options.Enabled["*"] = true;
8386

8487
var manager = new PluginManager(new DefaultActivator(), Options.Create(options));
8588
manager.Plugins.Select(p => p.Info)
@@ -107,6 +110,7 @@ public void LoadPluginsIgnoresUnknownPaths()
107110
options.Assemblies.Add(PluginPaths.TestPlugin);
108111
options.Assemblies.Add(PluginPaths.TestPlugin2);
109112
options.Assemblies.Add("ThisPluginDoesNotExist.dll");
113+
options.Enabled["*"] = true;
110114

111115
var manager = new PluginManager(new DefaultActivator(), Options.Create(options));
112116
manager.LoadPlugins();
@@ -143,11 +147,13 @@ public void ResolveAllInjectsServices()
143147
}
144148

145149
[Fact]
150+
[Obsolete]
146151
public void LoadDoesNotLoadDisabled()
147152
{
148153
var options = new PluginOptions();
149154
options.Assemblies.Add(PluginPaths.TestPlugin);
150155
options.Assemblies.Add(PluginPaths.TestPlugin2);
156+
options.Enabled["*"] = true;
151157
options.Disabled.Add("AppCoreNet.Extensions.Hosting.Plugins.TestPlugin2");
152158

153159
var manager = new PluginManager(new DefaultActivator(), Options.Create(options));
@@ -156,4 +162,66 @@ public void LoadDoesNotLoadDisabled()
156162
manager.Plugins.Should()
157163
.HaveCount(1);
158164
}
165+
166+
[Fact]
167+
public void LoadsOnlyExplicitlyEnabled()
168+
{
169+
var options = new PluginOptions();
170+
options.Assemblies.Add(PluginPaths.TestPlugin);
171+
options.Assemblies.Add(PluginPaths.TestPlugin2);
172+
options.Enabled["*"] = false;
173+
options.Enabled["AppCoreNet.Extensions.Hosting.Plugins.TestPlugin2"] = true;
174+
175+
var manager = new PluginManager(new DefaultActivator(), Options.Create(options));
176+
manager.LoadPlugins();
177+
178+
manager.Plugins.Should()
179+
.HaveCount(1);
180+
}
181+
182+
[Fact]
183+
public void DoesNotLoadExplicitlyDisabled()
184+
{
185+
var options = new PluginOptions();
186+
options.Assemblies.Add(PluginPaths.TestPlugin);
187+
options.Assemblies.Add(PluginPaths.TestPlugin2);
188+
options.Enabled["*"] = true;
189+
options.Enabled["AppCoreNet.Extensions.Hosting.Plugins.TestPlugin2"] = false;
190+
191+
var manager = new PluginManager(new DefaultActivator(), Options.Create(options));
192+
manager.LoadPlugins();
193+
194+
manager.Plugins.Should()
195+
.HaveCount(1);
196+
}
197+
198+
[Fact]
199+
public void LoadsAllPlugins()
200+
{
201+
var options = new PluginOptions();
202+
options.Assemblies.Add(PluginPaths.TestPlugin);
203+
options.Assemblies.Add(PluginPaths.TestPlugin2);
204+
options.Enabled["*"] = true;
205+
206+
var manager = new PluginManager(new DefaultActivator(), Options.Create(options));
207+
manager.LoadPlugins();
208+
209+
manager.Plugins.Should()
210+
.HaveCount(2);
211+
}
212+
213+
[Fact]
214+
public void LoadsNoPlugins()
215+
{
216+
var options = new PluginOptions();
217+
options.Assemblies.Add(PluginPaths.TestPlugin);
218+
options.Assemblies.Add(PluginPaths.TestPlugin2);
219+
options.Enabled["*"] = false;
220+
221+
var manager = new PluginManager(new DefaultActivator(), Options.Create(options));
222+
manager.LoadPlugins();
223+
224+
manager.Plugins.Should()
225+
.HaveCount(0);
226+
}
159227
}

Hosting/test/AppCoreNet.Extensions.Hosting.Plugins.Tests/PluginServiceDescriptorResolverTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public void RegistersServices()
2626
{
2727
o.Assemblies.Add(PluginPaths.TestPlugin);
2828
o.Assemblies.Add(PluginPaths.TestPlugin2);
29+
o.Enabled["*"] = true;
2930
});
3031

3132
services.TryAddEnumerableFrom<IStartupTask>(s => s.Plugins());

0 commit comments

Comments
 (0)