aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Common/Kernel/BaseKernel.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Common/Kernel/BaseKernel.cs')
-rw-r--r--MediaBrowser.Common/Kernel/BaseKernel.cs54
1 files changed, 31 insertions, 23 deletions
diff --git a/MediaBrowser.Common/Kernel/BaseKernel.cs b/MediaBrowser.Common/Kernel/BaseKernel.cs
index 4f1bdae6b..3704dbce0 100644
--- a/MediaBrowser.Common/Kernel/BaseKernel.cs
+++ b/MediaBrowser.Common/Kernel/BaseKernel.cs
@@ -59,21 +59,18 @@ namespace MediaBrowser.Common.Kernel
ApplicationPaths = new TApplicationPathsType();
}
- public virtual Task Init(IProgress<TaskProgress> progress)
+ public virtual async Task Init(IProgress<TaskProgress> progress)
{
- return Task.Run(() =>
- {
- ReloadLogger();
+ ReloadLogger();
- progress.Report(new TaskProgress() { Description = "Loading configuration", PercentComplete = 0 });
- ReloadConfiguration();
+ progress.Report(new TaskProgress() { Description = "Loading configuration", PercentComplete = 0 });
+ ReloadConfiguration();
- progress.Report(new TaskProgress() { Description = "Starting Http server", PercentComplete = 5 });
- ReloadHttpServer();
+ progress.Report(new TaskProgress() { Description = "Starting Http server", PercentComplete = 5 });
+ ReloadHttpServer();
- progress.Report(new TaskProgress() { Description = "Loading Plugins", PercentComplete = 10 });
- ReloadComposableParts();
- });
+ progress.Report(new TaskProgress() { Description = "Loading Plugins", PercentComplete = 10 });
+ await ReloadComposableParts().ConfigureAwait(false);
}
/// <summary>
@@ -98,10 +95,25 @@ namespace MediaBrowser.Common.Kernel
/// Uses MEF to locate plugins
/// Subclasses can use this to locate types within plugins
/// </summary>
- protected void ReloadComposableParts()
+ protected virtual Task ReloadComposableParts()
{
- DisposeComposableParts();
+ return Task.Run(() =>
+ {
+ DisposeComposableParts();
+
+ var container = GetCompositionContainer(includeCurrentAssembly: true);
+
+ container.ComposeParts(this);
+
+ OnComposablePartsLoaded();
+ container.Catalog.Dispose();
+ container.Dispose();
+ });
+ }
+
+ public CompositionContainer GetCompositionContainer(bool includeCurrentAssembly = false)
+ {
// Gets all plugin assemblies by first reading all bytes of the .dll and calling Assembly.Load against that
// This will prevent the .dll file from getting locked, and allow us to replace it when needed
IEnumerable<Assembly> pluginAssemblies = Directory.GetFiles(ApplicationPaths.PluginsPath, "*.dll", SearchOption.TopDirectoryOnly).Select(f => Assembly.Load(File.ReadAllBytes((f))));
@@ -112,17 +124,13 @@ namespace MediaBrowser.Common.Kernel
// Uncomment this if it's ever needed
//catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
- // Include composable parts in the subclass assembly
- catalog.Catalogs.Add(new AssemblyCatalog(GetType().Assembly));
-
- var container = new CompositionContainer(catalog);
-
- container.ComposeParts(this);
-
- OnComposablePartsLoaded();
+ if (includeCurrentAssembly)
+ {
+ // Include composable parts in the subclass assembly
+ catalog.Catalogs.Add(new AssemblyCatalog(GetType().Assembly));
+ }
- catalog.Dispose();
- container.Dispose();
+ return new CompositionContainer(catalog);
}
/// <summary>