Refactoring GetPlugins<T>()

This commit is contained in:
bao-qian
2015-11-02 18:52:34 +00:00
parent a668ed5e24
commit 818802cf5e
2 changed files with 12 additions and 24 deletions

View File

@@ -23,9 +23,9 @@ namespace Wox.Core.Plugin
{ {
public const string DirectoryName = "Plugins"; public const string DirectoryName = "Plugins";
private static List<PluginMetadata> pluginMetadatas; private static List<PluginMetadata> pluginMetadatas;
private static List<PluginPair> instantSearches; private static IEnumerable<PluginPair> instantSearches;
private static IEnumerable<PluginPair> exclusiveSearchPlugins; private static IEnumerable<PluginPair> exclusiveSearchPlugins;
private static List<PluginPair> contextMenuPlugins; private static IEnumerable<PluginPair> contextMenuPlugins;
private static List<PluginPair> plugins; private static List<PluginPair> plugins;
/// <summary> /// <summary>
@@ -203,7 +203,7 @@ namespace Wox.Core.Plugin
public static bool IsInstantQuery(string query) public static bool IsInstantQuery(string query)
{ {
return GetInstantSearchesPlugins().Any(o => ((IInstantQuery)o).IsInstantQuery(query)); return GetInstantSearchesPlugins().Any(o => ((IInstantQuery)o.Plugin).IsInstantQuery(query));
} }
private static bool IsInstantSearchPlugin(PluginMetadata pluginMetadata) private static bool IsInstantSearchPlugin(PluginMetadata pluginMetadata)
@@ -213,9 +213,9 @@ namespace Wox.Core.Plugin
GetInstantSearchesPlugins().Any(o => o.Metadata.ID == pluginMetadata.ID); GetInstantSearchesPlugins().Any(o => o.Metadata.ID == pluginMetadata.ID);
} }
private static List<PluginPair> GetInstantSearchesPlugins() private static IEnumerable<PluginPair> GetInstantSearchesPlugins()
{ {
instantSearches = instantSearches ?? GetPlugin<IInstantQuery>(); instantSearches = instantSearches ?? GetPlugins<IInstantQuery>();
return instantSearches; return instantSearches;
} }
@@ -229,26 +229,14 @@ namespace Wox.Core.Plugin
return AllPlugins.FirstOrDefault(o => o.Metadata.ID == id); return AllPlugins.FirstOrDefault(o => o.Metadata.ID == id);
} }
public static List<PluginPair> GetPlugin<T>() where T : class public static IEnumerable<PluginPair> GetPlugins<T>() where T : class
{ {
var results = new List<PluginPair>(); return from p in AllPlugins where p.Plugin is T select p;
foreach (var pluginPair in AllPlugins)
{
//need to load types from AllPlugins
//PluginInitContext is only available in this instance
T type = pluginPair.Plugin as T;
if (type != null)
{
results.Add(pluginPair);
}
}
return results;
} }
private static PluginPair GetExclusivePlugin(Query query) private static PluginPair GetExclusivePlugin(Query query)
{ {
exclusiveSearchPlugins = exclusiveSearchPlugins ?? exclusiveSearchPlugins = exclusiveSearchPlugins ?? GetPlugins<IExclusiveQuery>();
AllPlugins.Where(p => p.Plugin.GetType().GetInterfaces().Contains(typeof(IExclusiveQuery)));
var plugin = exclusiveSearchPlugins.FirstOrDefault(p => ((IExclusiveQuery)p.Plugin).IsExclusiveQuery(query)); var plugin = exclusiveSearchPlugins.FirstOrDefault(p => ((IExclusiveQuery)p.Plugin).IsExclusiveQuery(query));
return plugin; return plugin;
} }
@@ -272,7 +260,7 @@ namespace Wox.Core.Plugin
public static List<Result> GetPluginContextMenus(Result result) public static List<Result> GetPluginContextMenus(Result result)
{ {
contextMenuPlugins = contextMenuPlugins ?? GetPlugin<IContextMenu>(); contextMenuPlugins = contextMenuPlugins ?? GetPlugins<IContextMenu>();
var pluginPair = contextMenuPlugins.FirstOrDefault(o => o.Metadata.ID == result.PluginID); var pluginPair = contextMenuPlugins.FirstOrDefault(o => o.Metadata.ID == result.PluginID);
var plugin = (IContextMenu)pluginPair?.Plugin; var plugin = (IContextMenu)pluginPair?.Plugin;

View File

@@ -3,6 +3,7 @@ using System.Linq;
using System.Windows; using System.Windows;
using Wox.Core.i18n; using Wox.Core.i18n;
using Wox.Core.Plugin; using Wox.Core.Plugin;
using Wox.Infrastructure;
using Wox.Plugin; using Wox.Plugin;
namespace Wox.Core.UI namespace Wox.Core.UI
@@ -39,9 +40,8 @@ namespace Wox.Core.UI
internal static void ApplyPluginLanguages() internal static void ApplyPluginLanguages()
{ {
RemoveResource(PluginManager.DirectoryName); RemoveResource(PluginManager.DirectoryName);
foreach (var languageFile in (PluginManager.AllPlugins.Select(p => p.Plugin). foreach (var languageFile in (PluginManager.GetPlugins<IPluginI18n>().
Where(plugin => plugin.GetType().GetInterfaces().Contains(typeof(IPluginI18n))). Select(plugin => InternationalizationManager.Instance.GetLanguageFile(((IPluginI18n)plugin.Plugin).GetLanguagesFolder())).
Select(plugin => InternationalizationManager.Instance.GetLanguageFile(((IPluginI18n)plugin).GetLanguagesFolder())).
Where(file => !string.IsNullOrEmpty(file)))) Where(file => !string.IsNullOrEmpty(file))))
{ {
Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary