Skip to content

Commit

Permalink
Feat | DI (PluginEventService)
Browse files Browse the repository at this point in the history
  • Loading branch information
kitUIN committed Dec 25, 2024
1 parent 466e100 commit 0b59787
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 21 deletions.
38 changes: 31 additions & 7 deletions ShadowPluginLoader.WinUI/AbstractPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Collections.Generic;
using CustomExtensions.WinUI;
using System;
using Serilog;

namespace ShadowPluginLoader.WinUI;

Expand All @@ -14,13 +15,27 @@ public abstract class AbstractPlugin : IPlugin
{
/// <inheritdoc />
public abstract string DisplayName { get; }

/// <summary>
/// Logger
/// </summary>
protected ILogger Logger { get; }

/// <summary>
/// PluginEventService
/// </summary>
protected PluginEventService PluginEventService { get; }

/// <summary>
/// Default
/// </summary>
protected AbstractPlugin()
protected AbstractPlugin(ILogger logger, PluginEventService pluginEventService)
{
Logger = logger;
PluginEventService = pluginEventService;
Init();
}

/// <summary>
/// Init
/// </summary>
Expand All @@ -40,22 +55,25 @@ protected void Init()
/// <summary>
/// Resource Dictionaries, example: ms-appx:///Themes/BikaTheme.xaml
/// </summary>
protected virtual IEnumerable<string> ResourceDictionaries =>
protected virtual IEnumerable<string> ResourceDictionaries =>
new List<string>();

/// <summary>
/// Is Enabled
/// </summary>
private bool _isEnabled;

/// <inheritdoc/>
public bool IsEnabled {
public bool IsEnabled
{
get => _isEnabled;
set
{
if (_isEnabled == value) return;
if (value)
{
Enabled();
PluginEventService.InvokePluginEnabled(this,
PluginEventService.InvokePluginEnabled(this,
new Args.PluginEventArgs(Id, Enums.PluginStatus.Enabled));
}
else
Expand All @@ -64,25 +82,31 @@ public bool IsEnabled {
PluginEventService.InvokePluginDisabled(this,
new Args.PluginEventArgs(Id, Enums.PluginStatus.Disabled));
}

_isEnabled = value;
PluginSettingsHelper.SetPluginEnabled(Id, _isEnabled);
}
}

/// <summary>
/// Plugin Disabled (Before Plugin Disabled Event)
/// </summary>
protected virtual void Disabled()
{

}

/// <summary>
/// Plugin Enabled (Before Plugin Enabled Event)
/// </summary>
protected virtual void Enabled()
{

}

/// <inheritdoc/>
public virtual void Loaded()
{
}

/// <inheritdoc/>
public abstract string Id { get; }
}
}
37 changes: 24 additions & 13 deletions ShadowPluginLoader.WinUI/AbstractPluginLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,27 +34,36 @@ public abstract partial class AbstractPluginLoader<TMeta, TAPlugin>
/// Plugins Folder
/// </summary>
protected abstract string PluginFolder { get; }

/// <summary>
/// Logger
/// </summary>
protected ILogger? Logger { get; }
protected ILogger Logger { get; }

/// <summary>
/// PluginEventService
/// </summary>
protected PluginEventService PluginEventService { get; }

/// <summary>
/// Default
/// </summary>
/// <param name="logger">log</param>
protected AbstractPluginLoader(ILogger logger)
/// <param name="pluginEventService">pluginEventService</param>
protected AbstractPluginLoader(ILogger logger, PluginEventService pluginEventService)
{
Logger = logger;
PluginEventService = pluginEventService;
}

/// <summary>
/// Default
/// </summary>
protected AbstractPluginLoader():
this(Log.ForContext<AbstractPluginLoader<TMeta, TAPlugin>>())
protected AbstractPluginLoader(PluginEventService pluginEventService) :
this(Log.ForContext<AbstractPluginLoader<TMeta, TAPlugin>>(), pluginEventService)
{
}

/// <summary>
/// All Plugins
/// </summary>
Expand Down Expand Up @@ -90,7 +99,7 @@ protected virtual async Task CheckPluginMetaDataFromJson(DirectoryInfo dir)
/// <param name="dir">The Plugin Folder</param>
protected virtual List<string> GetAllPathAsync(DirectoryInfo dir)
{
var pls = dir.GetFiles(PluginJson,SearchOption.AllDirectories);
var pls = dir.GetFiles(PluginJson, SearchOption.AllDirectories);
return pls.Select(x => x.FullName).ToList();
}

Expand All @@ -110,6 +119,7 @@ protected virtual async Task PreOnePluginAsync(string pluginJsonFilePath)
// The Folder Containing The Plugin Dll Not Found
throw new PluginImportException($"Dir Not Found: {dirPath}");
}

var pluginFilePath = Path.Combine(dirPath, meta!.DllName + ".dll");
if (!File.Exists(pluginFilePath)) throw new PluginImportException($"Not Found {pluginFilePath}");
await CheckPluginMetaDataAsync(meta!, pluginFilePath);
Expand All @@ -130,6 +140,7 @@ protected virtual void LoadPlugin(Type? plugin)
instance.IsEnabled = PluginSettingsHelper.GetPluginIsEnabled(meta.Id);
Logger?.Information("{Pre}{ID}: Load Success!",
LoggerPrefix, meta.Id);
if (instance.IsEnabled) instance.Loaded();
PluginEventService.InvokePluginLoaded(this, new PluginEventArgs(meta.Id, PluginStatus.Loaded));
}

Expand All @@ -150,8 +161,8 @@ protected virtual void CheckPluginType(Type? plugin)
/// <param name="meta">PluginMetaData</param>
protected virtual void CheckPluginMetaData(TMeta meta)
{

}

/// <summary>
/// LoadPlugin From SortedPluginTypes
/// </summary>
Expand All @@ -172,8 +183,8 @@ protected virtual void LoadPluginType(IEnumerable<SortPluginData> sortPlugins)
/// <exception cref="PluginImportException">PluginMetaData Type Is Null</exception>
protected virtual TMeta GetAndCheckPluginMetaData(Type plugin)
{
var meta = plugin.GetPluginMetaData<TMeta>()
?? throw new PluginImportException($"{plugin.FullName}: MetaData Not Found");
var meta = plugin.GetPluginMetaData<TMeta>()
?? throw new PluginImportException($"{plugin.FullName}: MetaData Not Found");
CheckPluginMetaData(meta);
return meta;
}
Expand Down Expand Up @@ -227,9 +238,8 @@ protected virtual TAPlugin RegisterPluginMain(Type plugin, TMeta meta)
/// <summary>
/// Register Plugin DI
/// </summary>
protected virtual void LoadPluginDi(Type tPlugin,TAPlugin aPlugin ,TMeta meta)
protected virtual void LoadPluginDi(Type tPlugin, TAPlugin aPlugin, TMeta meta)
{

}

/// <summary>
Expand All @@ -241,15 +251,16 @@ protected virtual void CheckPluginInZip(string zipPath)
{
using FileStream zipToOpen = new(zipPath, FileMode.Open);
using ZipArchive archive = new(zipToOpen, ZipArchiveMode.Update);
var jsonEntry = archive.GetEntry(PluginJson) ?? throw new PluginImportException($"Not Found {PluginJson} in zip {zipPath}");
var jsonEntry = archive.GetEntry(PluginJson) ??
throw new PluginImportException($"Not Found {PluginJson} in zip {zipPath}");
}

/// <summary>
/// UnZip
/// </summary>
protected virtual string UnZip(string zipPath, string outputPath)
{
ZipFile.ExtractToDirectory(zipPath,outputPath,true);
ZipFile.ExtractToDirectory(zipPath, outputPath, true);
return outputPath;
}
}
1 change: 1 addition & 0 deletions ShadowPluginLoader.WinUI/DIFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ static DiFactory()
Services.Register(
Made.Of(() => Serilog.Log.ForContext(Arg.Index<Type>(0)), r => r.Parent.ImplementationType),
setup: Setup.With(condition: r => r.Parent.ImplementationType != null));
Services.Register<PluginEventService>(reuse:Reuse.Singleton);
}

}
2 changes: 1 addition & 1 deletion ShadowPluginLoader.WinUI/ShadowPluginLoader.WinUI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<EnableMsixTooling>true</EnableMsixTooling>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<!-- Nuget -->
<Version>1.3.9</Version>
<Version>1.4.0</Version>
<PackageId>ShadowPluginLoader.WinUI</PackageId>
<Owner>kitUIN</Owner>
<Authors>kitUIN</Authors>
Expand Down

0 comments on commit 0b59787

Please sign in to comment.