Skip to content

Commit b0cc275

Browse files
committed
Added the ability to dispose a plugin
1 parent f523e4c commit b0cc275

File tree

2 files changed

+80
-2
lines changed

2 files changed

+80
-2
lines changed

Source/Shared/Configuration/ExceptionlessConfiguration.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,8 +271,10 @@ public void RemovePlugin<T>() where T : IEventPlugin {
271271
/// </summary>
272272
/// <param name="key">The key for the plugin to be removed.</param>
273273
public void RemovePlugin(string key) {
274-
if (_plugins.ContainsKey(key))
274+
if (_plugins.ContainsKey(key)) {
275+
_plugins[key].Dispose();
275276
_plugins.Remove(key);
277+
}
276278
}
277279

278280
private int GetPriority(Type type) {
@@ -329,7 +331,7 @@ public ValidationResult() {
329331
}
330332

331333
[DebuggerDisplay("Key: {Key}, Priority: {Priority}")]
332-
public class PluginRegistration {
334+
public class PluginRegistration : IDisposable {
333335
private readonly Lazy<IEventPlugin> _plugin;
334336
public PluginRegistration(string key, int priority, Lazy<IEventPlugin> plugin) {
335337
Key = key;
@@ -346,6 +348,14 @@ public PluginRegistration(string key, int priority, Lazy<IEventPlugin> plugin) {
346348
public override string ToString() {
347349
return $"Key: {Key}, Priority: {Priority}";
348350
}
351+
352+
public void Dispose() {
353+
if (!_plugin.IsValueCreated)
354+
return;
355+
356+
var disposable = _plugin.Value as IDisposable;
357+
disposable?.Dispose();
358+
}
349359
}
350360
}
351361
}

Source/Tests/Plugins/PluginTests.cs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,74 @@ public void PrivateInformation_WillNotUpdateIdentity() {
193193
Assert.Equal("Blake", user?.Name);
194194
}
195195

196+
197+
[Fact]
198+
public void LazyLoadAndRemovePlugin() {
199+
var configuration = new ExceptionlessConfiguration(DependencyResolver.Default);
200+
foreach (var plugin in configuration.Plugins)
201+
configuration.RemovePlugin(plugin.Key);
202+
203+
configuration.AddPlugin<ThrowIfInitializedTestPlugin>();
204+
configuration.RemovePlugin<ThrowIfInitializedTestPlugin>();
205+
}
206+
207+
private class ThrowIfInitializedTestPlugin : IEventPlugin, IDisposable {
208+
public ThrowIfInitializedTestPlugin() {
209+
throw new ApplicationException("Plugin shouldn't be constructed");
210+
}
211+
212+
public void Run(EventPluginContext context) {}
213+
214+
public void Dispose() {
215+
throw new ApplicationException("Plugin shouldn't be created or disposed");
216+
}
217+
}
218+
219+
[Fact]
220+
public void CanDisposePlugin() {
221+
var configuration = new ExceptionlessConfiguration(DependencyResolver.Default);
222+
foreach (var plugin in configuration.Plugins)
223+
configuration.RemovePlugin(plugin.Key);
224+
225+
Assert.Equal(0, CounterTestPlugin.ConstructorCount);
226+
Assert.Equal(0, CounterTestPlugin.RunCount);
227+
Assert.Equal(0, CounterTestPlugin.DisposeCount);
228+
229+
configuration.AddPlugin<CounterTestPlugin>();
230+
configuration.AddPlugin<CounterTestPlugin>();
231+
232+
for (int i = 0; i < 2; i++) {
233+
foreach (var pluginRegistration in configuration.Plugins)
234+
pluginRegistration.Plugin.Run(new EventPluginContext(new ExceptionlessClient(), new Event()));
235+
}
236+
237+
configuration.RemovePlugin<CounterTestPlugin>();
238+
configuration.RemovePlugin<CounterTestPlugin>();
239+
240+
241+
Assert.Equal(1, CounterTestPlugin.ConstructorCount);
242+
Assert.Equal(2, CounterTestPlugin.RunCount);
243+
Assert.Equal(1, CounterTestPlugin.DisposeCount);
244+
}
245+
246+
public class CounterTestPlugin : IEventPlugin, IDisposable {
247+
public static byte ConstructorCount = 0;
248+
public static byte RunCount = 0;
249+
public static byte DisposeCount = 0;
250+
251+
public CounterTestPlugin() {
252+
ConstructorCount++;
253+
}
254+
255+
public void Run(EventPluginContext context) {
256+
RunCount++;
257+
}
258+
259+
public void Dispose() {
260+
DisposeCount++;
261+
}
262+
}
263+
196264
[Fact]
197265
public void VerifyPriority() {
198266
var config = new ExceptionlessConfiguration(DependencyResolver.CreateDefault());

0 commit comments

Comments
 (0)