mirror of
https://github.com/Artemis-RGB/Artemis
synced 2026-11-12 20:06:33 +00:00
Plugins - Gave each plugin its own child Ninject kernel
Plugins - Added support for validation in VMs
This commit is contained in:
1 parent
693ea29600
commit
2547b6a8bf
18 files changed
+132
-36
No files matched your search
@@ -0,0 +1,19 @@
|
||||
using System;
|
||||
using Ninject.Modules;
|
||||
|
||||
namespace Artemis.Core.Ninject
|
||||
{
|
||||
internal class PluginModule : NinjectModule
|
||||
{
|
||||
public PluginModule(PluginInfo pluginInfo)
|
||||
{
|
||||
PluginInfo = pluginInfo ?? throw new ArgumentNullException(nameof(pluginInfo));
|
||||
}
|
||||
|
||||
public PluginInfo PluginInfo { get; }
|
||||
|
||||
public override void Load()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -16,6 +16,16 @@ namespace Artemis.Core.LayerBrushes
|
||||
LayerBrush = layerBrush;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of the <see cref="BrushConfigurationViewModel" /> class with a validator
|
||||
/// </summary>
|
||||
/// <param name="layerBrush"></param>
|
||||
/// <param name="validator"></param>
|
||||
protected BrushConfigurationViewModel(BaseLayerBrush layerBrush, IModelValidator validator) : base(validator)
|
||||
{
|
||||
LayerBrush = layerBrush;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the layer brush this view model is associated with
|
||||
/// </summary>
|
||||
|
||||
@@ -62,7 +62,7 @@ namespace Artemis.Core.LayerBrushes
|
||||
if (layer.LayerBrush != null)
|
||||
throw new ArtemisCoreException("Layer already has an instantiated layer brush");
|
||||
|
||||
var brush = (BaseLayerBrush) CoreService.Kernel.Get(LayerBrushType);
|
||||
var brush = (BaseLayerBrush) LayerBrushProvider.PluginInfo.Kernel.Get(LayerBrushType);
|
||||
brush.Layer = layer;
|
||||
brush.Descriptor = this;
|
||||
brush.Initialize();
|
||||
|
||||
@@ -16,6 +16,16 @@ namespace Artemis.Core.LayerEffects
|
||||
LayerEffect = layerEffect;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of the <see cref="EffectConfigurationViewModel" /> class with a validator
|
||||
/// </summary>
|
||||
/// <param name="layerEffect"></param>
|
||||
/// <param name="validator"></param>
|
||||
protected EffectConfigurationViewModel(BaseLayerEffect layerEffect, IModelValidator validator) : base(validator)
|
||||
{
|
||||
LayerEffect = layerEffect;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the layer effect this view model is associated with
|
||||
/// </summary>
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace Artemis.Core.LayerEffects
|
||||
/// The plugin that provided this <see cref="LayerEffectDescriptor" />
|
||||
/// </summary>
|
||||
public LayerEffectProvider LayerEffectProvider { get; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Gets the GUID this descriptor is acting as a placeholder for. If null, this descriptor is not a placeholder
|
||||
/// </summary>
|
||||
@@ -67,7 +67,7 @@ namespace Artemis.Core.LayerEffects
|
||||
return;
|
||||
}
|
||||
|
||||
var effect = (BaseLayerEffect)CoreService.Kernel.Get(LayerEffectType);
|
||||
var effect = (BaseLayerEffect) LayerEffectProvider.PluginInfo.Kernel.Get(LayerEffectType);
|
||||
effect.ProfileElement = renderElement;
|
||||
effect.EntityId = entity.Id;
|
||||
effect.Order = entity.Order;
|
||||
|
||||
@@ -16,6 +16,16 @@ namespace Artemis.Core
|
||||
Plugin = plugin;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of the <see cref="PluginConfigurationViewModel" /> class with a validator
|
||||
/// </summary>
|
||||
/// <param name="plugin"></param>
|
||||
/// <param name="validator"></param>
|
||||
protected PluginConfigurationViewModel(Plugin plugin, IModelValidator validator) : base(validator)
|
||||
{
|
||||
Plugin = plugin;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the plugin this configuration view model is associated with
|
||||
/// </summary>
|
||||
|
||||
@@ -4,6 +4,8 @@ using System.Reflection;
|
||||
using Artemis.Storage.Entities.Plugins;
|
||||
using McMaster.NETCore.Plugins;
|
||||
using Newtonsoft.Json;
|
||||
using Ninject;
|
||||
using Ninject.Extensions.ChildKernel;
|
||||
using Stylet;
|
||||
|
||||
namespace Artemis.Core
|
||||
@@ -135,13 +137,18 @@ namespace Artemis.Core
|
||||
/// <summary>
|
||||
/// The assembly the plugin code lives in
|
||||
/// </summary>
|
||||
internal Assembly Assembly { get; set; }
|
||||
public Assembly Assembly { get; internal set; }
|
||||
|
||||
/// <summary>
|
||||
/// The Ninject kernel of the plugin
|
||||
/// </summary>
|
||||
public IKernel Kernel { get; internal set; }
|
||||
|
||||
/// <summary>
|
||||
/// The entity representing the plugin
|
||||
/// </summary>
|
||||
internal PluginEntity PluginEntity { get; set; }
|
||||
|
||||
|
||||
/// <inheritdoc />
|
||||
public override string ToString()
|
||||
{
|
||||
|
||||
@@ -41,6 +41,8 @@ namespace Artemis.Core.Services
|
||||
IRgbService rgbService, ISurfaceService surfaceService, IProfileService profileService, IModuleService moduleService)
|
||||
{
|
||||
Kernel = kernel;
|
||||
Constants.CorePluginInfo.Kernel = kernel;
|
||||
|
||||
_logger = logger;
|
||||
_pluginService = pluginService;
|
||||
_rgbService = rgbService;
|
||||
|
||||
@@ -4,6 +4,7 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using Artemis.Core.DeviceProviders;
|
||||
using Artemis.Core.Ninject;
|
||||
using Artemis.Storage.Entities.Plugins;
|
||||
using Artemis.Storage.Repositories.Interfaces;
|
||||
using McMaster.NETCore.Plugins;
|
||||
@@ -25,7 +26,6 @@ namespace Artemis.Core.Services
|
||||
private readonly ILogger _logger;
|
||||
private readonly IPluginRepository _pluginRepository;
|
||||
private readonly List<PluginInfo> _plugins;
|
||||
private IKernel _childKernel;
|
||||
|
||||
public PluginService(IKernel kernel, ILogger logger, IPluginRepository pluginRepository)
|
||||
{
|
||||
@@ -110,9 +110,6 @@ namespace Artemis.Core.Services
|
||||
// Unload all currently loaded plugins first
|
||||
UnloadPlugins();
|
||||
|
||||
// Create a child kernel and app domain that will only contain the plugins
|
||||
_childKernel = new ChildKernel(_kernel);
|
||||
|
||||
// Load the plugin assemblies into the plugin context
|
||||
var pluginDirectory = new DirectoryInfo(Path.Combine(Constants.DataFolder, "plugins"));
|
||||
foreach (var subDirectory in pluginDirectory.EnumerateDirectories())
|
||||
@@ -160,13 +157,6 @@ namespace Artemis.Core.Services
|
||||
while (_plugins.Count > 0)
|
||||
UnloadPlugin(_plugins[0]);
|
||||
|
||||
// Dispose the child kernel and therefore any leftover plugins instantiated with it
|
||||
if (_childKernel != null)
|
||||
{
|
||||
_childKernel.Dispose();
|
||||
_childKernel = null;
|
||||
}
|
||||
|
||||
_plugins.Clear();
|
||||
}
|
||||
}
|
||||
@@ -232,7 +222,9 @@ namespace Artemis.Core.Services
|
||||
{
|
||||
new Parameter("PluginInfo", pluginInfo, false)
|
||||
};
|
||||
pluginInfo.Instance = (Plugin) _childKernel.Get(pluginType, constraint: null, parameters: parameters);
|
||||
pluginInfo.Kernel = new ChildKernel(_kernel);
|
||||
pluginInfo.Kernel.Load(new PluginModule(pluginInfo));
|
||||
pluginInfo.Instance = (Plugin) pluginInfo.Kernel.Get(pluginType, constraint: null, parameters: parameters);
|
||||
pluginInfo.Instance.PluginInfo = pluginInfo;
|
||||
}
|
||||
catch (Exception e)
|
||||
@@ -262,10 +254,10 @@ namespace Artemis.Core.Services
|
||||
OnPluginDisabled(new PluginEventArgs(pluginInfo));
|
||||
}
|
||||
|
||||
_childKernel.Unbind(pluginInfo.Instance.GetType());
|
||||
|
||||
pluginInfo.Instance.Dispose();
|
||||
pluginInfo.PluginLoader.Dispose();
|
||||
pluginInfo.Kernel.Dispose();
|
||||
|
||||
_plugins.Remove(pluginInfo);
|
||||
|
||||
OnPluginUnloaded(new PluginEventArgs(pluginInfo));
|
||||
|
||||
Reference in new issue
Block a user