Example #1
0
        public PluginLoader(ILoadablePlugin loadableView, Action <PluginLoader> onSelection)
        {
            PluginName = loadableView.PresentationName;
            PluginLogo = loadableView.Logo as UIElement;
            ViewPlugin = loadableView.View;

            OnSelect = new UiCommand(delegate { onSelection(this); });
        }
        private void LoadRegisterPlugin(string pluginPath)
        {
            try
            {
                var assembly = Assembly.LoadFrom(pluginPath);

                Type[] types = assembly.GetTypes();
                foreach (var type in types)
                {
                    // dbConfig = get configuration from database
                    // if(dbConfig == null)
                    //      //This plugin was never configured.
                    //      1. Retrieve initial configuration from plugin.
                    //      2. Save configuration in DB so someone can go to the application and fill outvalues for this plugin.
                    // else
                    //      //This plugin was configured - maybe do some test or check a field set to true in DB
                    //      1. Pass configuration to the plugin
                    //      2. Save plugin to _loadedPlugins.
                    //
                    //      DONE


                    if (type.Name.Equals(WellKnownData.PluginInfoClassName) && type.IsClass)
                    {
                        _logger.Information($"Loading plugin from path {pluginPath}.");
                        var plugin = (ILoadablePlugin)Activator.CreateInstance(type);

                        var name        = plugin.Name;
                        var description = plugin.Description;
                        plugin.SetLogger(_logger);

                        _logger.Information($"Successfully loaded plugin {name} : {description}.");

                        Dictionary <string, string> configuration  = null;
                        ILoadablePlugin             pluginInstance = plugin;

                        var pluginInfo = _configurationRepository.GetPluginByName(name);

                        if (!_loadedPlugins.ContainsKey(name))
                        {
                            _loadedPlugins.Add(name, pluginInstance);
                        }
                        else
                        {
                            //If an instance of the plugin was already found, then use the existing instance.
                            pluginInstance = _loadedPlugins[name];
                        }

                        if (pluginInfo == null)
                        {
                            pluginInfo = new Plugin()
                            {
                                Name = name, Description = description
                            };
                            pluginInfo.Configuration = pluginInstance.GetPluginInitialConfiguration();

                            _configurationRepository.SavePluginConfiguration(pluginInfo);

                            _logger.Information($"Discovered new unconfigured plugin {Path.GetFileName(pluginPath)}.");
                        }
                        else
                        {
                            configuration = pluginInfo.Configuration;
                            if (configuration != null)
                            {
                                pluginInstance.SetPluginConfiguration(configuration);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                _logger.Error($"Failed to load plugin {Path.GetFileName(pluginPath)}: {ex.Message}.");
            }
        }