Ver código fonte

Added extra functionality to support registrar.

Greenback 4 anos atrás
pai
commit
0b73a1d90f

+ 29 - 0
Emby.Server.Implementations/AppBase/BaseConfigurationManager.cs

@@ -133,6 +133,35 @@ namespace Emby.Server.Implementations.AppBase
             }
         }
 
+        /// <summary>
+        /// Manually pre-loads a factory so that it is available pre system initialisation.
+        /// </summary>
+        /// <typeparam name="T">Class to register.</typeparam>
+        public virtual void RegisterConfiguration<T>()
+        {
+            if (!typeof(IConfigurationFactory).IsAssignableFrom(typeof(T)))
+            {
+                throw new ArgumentException("Parameter does not implement IConfigurationFactory");
+            }
+
+            IConfigurationFactory factory = (IConfigurationFactory)Activator.CreateInstance(typeof(T));
+
+            if (_configurationFactories == null)
+            {
+                _configurationFactories = new IConfigurationFactory[] { factory };
+            }
+            else
+            {
+                var list = _configurationFactories.ToList<IConfigurationFactory>();
+                list.Add(factory);
+                _configurationFactories = list.ToArray();
+            }
+
+            _configurationStores = _configurationFactories
+                .SelectMany(i => i.GetConfigurations())
+                .ToArray();
+        }
+
         /// <summary>
         /// Adds parts.
         /// </summary>

+ 6 - 63
Emby.Server.Implementations/ApplicationHost.cs

@@ -128,7 +128,6 @@ namespace Emby.Server.Implementations
         private ISessionManager _sessionManager;
         private IHttpClientFactory _httpClientFactory;
         private IWebSocketManager _webSocketManager;
-        private Dictionary<Type, Assembly> _pluginRegistrations;
         private string[] _urlPrefixes;
 
         /// <summary>
@@ -262,8 +261,6 @@ namespace Emby.Server.Implementations
 
             ServiceCollection = serviceCollection;
 
-            _pluginRegistrations = new Dictionary<Type, Assembly>();
-
             _networkManager = networkManager;
             networkManager.LocalSubnetsFn = GetConfiguredLocalSubnets;
 
@@ -505,7 +502,7 @@ namespace Emby.Server.Implementations
 
             RegisterServices();
 
-            RegisterPlugIns();
+            RegisterPlugInServices();
         }
 
         /// <summary>
@@ -770,7 +767,6 @@ namespace Emby.Server.Implementations
 
             ConfigurationManager.AddParts(GetExports<IConfigurationFactory>());
             _plugins = GetExports<IPlugin>()
-                        .Select(LoadPlugin)
                         .Where(i => i != null)
                         .ToArray();
 
@@ -819,51 +815,6 @@ namespace Emby.Server.Implementations
             Resolve<IIsoManager>().AddParts(GetExports<IIsoMounter>());
         }
 
-        private IPlugin LoadPlugin(IPlugin plugin)
-        {
-            try
-            {
-                if (plugin is IPluginAssembly assemblyPlugin)
-                {
-                    var assembly = plugin.GetType().Assembly;
-                    var assemblyName = assembly.GetName();
-                    var assemblyFilePath = assembly.Location;
-
-                    var dataFolderPath = Path.Combine(ApplicationPaths.PluginsPath, Path.GetFileNameWithoutExtension(assemblyFilePath));
-
-                    assemblyPlugin.SetAttributes(assemblyFilePath, dataFolderPath, assemblyName.Version);
-
-                    try
-                    {
-                        var idAttributes = assembly.GetCustomAttributes(typeof(GuidAttribute), true);
-                        if (idAttributes.Length > 0)
-                        {
-                            var attribute = (GuidAttribute)idAttributes[0];
-                            var assemblyId = new Guid(attribute.Value);
-
-                            assemblyPlugin.SetId(assemblyId);
-                        }
-                    }
-                    catch (Exception ex)
-                    {
-                        Logger.LogError(ex, "Error getting plugin Id from {PluginName}.", plugin.GetType().FullName);
-                    }
-                }
-
-                if (plugin is IHasPluginConfiguration hasPluginConfiguration)
-                {
-                    hasPluginConfiguration.SetStartupInfo(s => Directory.CreateDirectory(s));
-                }
-            }
-            catch (Exception ex)
-            {
-                Logger.LogError(ex, "Error loading plugin {PluginName}", plugin.GetType().FullName);
-                return null;
-            }
-
-            return plugin;
-        }
-
         /// <summary>
         /// Discovers the types.
         /// </summary>
@@ -874,22 +825,20 @@ namespace Emby.Server.Implementations
             _allConcreteTypes = GetTypes(GetComposablePartAssemblies()).ToArray();
         }
 
-        private void RegisterPlugIns()
+        private void RegisterPlugInServices()
         {
-            foreach ((var pluginType, var assembly) in _pluginRegistrations)
+            foreach (var pluginServiceRegistrar in GetExportTypes<IPluginRegistrar>())
             {
                 try
                 {
-                    var pluginRegistration = Activator.CreateInstance(pluginType);
-                    pluginType.InvokeMember("RegisterServices", BindingFlags.InvokeMethod, null, pluginRegistration, new object[] { ServiceCollection }, CultureInfo.InvariantCulture);
+                    var instance = (IPluginRegistrar)Activator.CreateInstance(pluginServiceRegistrar);
+                    instance.RegisterServices(ServiceCollection);
                 }
                 catch (Exception ex)
                 {
-                    Logger.LogError(ex, "Error registering {Assembly} with D.I.", assembly);
+                    Logger.LogError(ex, "Error registering {Assembly} with D.I.", pluginServiceRegistrar.Assembly);
                 }
             }
-
-            _pluginRegistrations.Clear();
         }
 
         private IEnumerable<Type> GetTypes(IEnumerable<Assembly> assemblies)
@@ -900,12 +849,6 @@ namespace Emby.Server.Implementations
                 try
                 {
                     exportedTypes = ass.GetExportedTypes();
-
-                    Type reg = (Type)exportedTypes.Where(p => string.Equals(p.Name, "PluginRegistration", StringComparison.OrdinalIgnoreCase)).FirstOrDefault();
-                    if (reg != null)
-                    {
-                        _pluginRegistrations.Add(reg, ass);
-                    }
                 }
                 catch (FileNotFoundException ex)
                 {

+ 6 - 0
MediaBrowser.Common/Configuration/IConfigurationManager.cs

@@ -46,6 +46,12 @@ namespace MediaBrowser.Common.Configuration
         /// <param name="newConfiguration">The new configuration.</param>
         void ReplaceConfiguration(BaseApplicationConfiguration newConfiguration);
 
+        /// <summary>
+        /// Manually pre-loads a factory so that it is available pre system initialisation.
+        /// </summary>
+        /// <typeparam name="T">Class to register.</typeparam>
+        void RegisterConfiguration<T>();
+
         /// <summary>
         /// Gets the configuration.
         /// </summary>

+ 25 - 10
MediaBrowser.Common/Plugins/BasePlugin.cs

@@ -3,6 +3,7 @@
 using System;
 using System.IO;
 using System.Reflection;
+using System.Runtime.InteropServices;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Model.Plugins;
 using MediaBrowser.Model.Serialization;
@@ -82,16 +83,6 @@ namespace MediaBrowser.Common.Plugins
         {
         }
 
-        /// <inheritdoc />
-        public virtual void RegisterServices(IServiceCollection serviceCollection)
-        {
-        }
-
-        /// <inheritdoc />
-        public virtual void UnregisterServices(IServiceCollection serviceCollection)
-        {
-        }
-
         /// <inheritdoc />
         public void SetAttributes(string assemblyFilePath, string dataFolderPath, Version assemblyVersion)
         {
@@ -140,6 +131,30 @@ namespace MediaBrowser.Common.Plugins
         {
             ApplicationPaths = applicationPaths;
             XmlSerializer = xmlSerializer;
+            if (this is IPluginAssembly assemblyPlugin)
+            {
+                var assembly = GetType().Assembly;
+                var assemblyName = assembly.GetName();
+                var assemblyFilePath = assembly.Location;
+
+                var dataFolderPath = Path.Combine(ApplicationPaths.PluginsPath, Path.GetFileNameWithoutExtension(assemblyFilePath));
+
+                assemblyPlugin.SetAttributes(assemblyFilePath, dataFolderPath, assemblyName.Version);
+
+                var idAttributes = assembly.GetCustomAttributes(typeof(GuidAttribute), true);
+                if (idAttributes.Length > 0)
+                {
+                    var attribute = (GuidAttribute)idAttributes[0];
+                    var assemblyId = new Guid(attribute.Value);
+
+                    assemblyPlugin.SetId(assemblyId);
+                }
+            }
+
+            if (this is IHasPluginConfiguration hasPluginConfiguration)
+            {
+                hasPluginConfiguration.SetStartupInfo(s => Directory.CreateDirectory(s));
+            }
         }
 
         /// <summary>

+ 0 - 12
MediaBrowser.Common/Plugins/IPlugin.cs

@@ -62,18 +62,6 @@ namespace MediaBrowser.Common.Plugins
         /// Called when just before the plugin is uninstalled from the server.
         /// </summary>
         void OnUninstalling();
-
-        /// <summary>
-        /// Registers the plugin's services to the service collection.
-        /// </summary>
-        /// <param name="serviceCollection">The service collection.</param>
-        void RegisterServices(IServiceCollection serviceCollection);
-
-        /// <summary>
-        /// Unregisters the plugin's services from the service collection.
-        /// </summary>
-        /// <param name="serviceCollection">The service collection.</param>
-        void UnregisterServices(IServiceCollection serviceCollection);
     }
 
     public interface IHasPluginConfiguration

+ 17 - 0
MediaBrowser.Common/Plugins/IPluginRegistrar.cs

@@ -0,0 +1,17 @@
+namespace MediaBrowser.Common.Plugins
+{
+    using Microsoft.Extensions.DependencyInjection;
+
+    /// <summary>
+    /// Defines the <see cref="IPluginRegistrar" />.
+    /// </summary>
+    public interface IPluginRegistrar
+    {
+        /// <summary>
+        /// Registers the plugin's services with the service collection.
+        /// This object is created prior to the plugin creation, so access to other classes is limited.
+        /// </summary>
+        /// <param name="serviceCollection">The service collection.</param>
+        void RegisterServices(IServiceCollection serviceCollection);
+    }
+}