diff --git a/source/Glimpse.Core/Configuration/GlimpseConfiguration.cs b/source/Glimpse.Core/Configuration/GlimpseConfiguration.cs
index 5d4f75240..68d94b3ed 100644
--- a/source/Glimpse.Core/Configuration/GlimpseConfiguration.cs
+++ b/source/Glimpse.Core/Configuration/GlimpseConfiguration.cs
@@ -103,6 +103,16 @@ public PluginBlacklistCollection PluginBlacklist
}
}
+ [ConfigurationProperty("pluginDirectories", IsRequired = false)]
+ public PluginDirectoryCollection PluginDirectories
+ {
+ set { this["pluginDirectories"] = value; }
+ get
+ {
+ return this["pluginDirectories"] as PluginDirectoryCollection;
+ }
+ }
+
[ConfigurationProperty("urlBlacklist", IsRequired = false)]
public UrlBlacklistCollection UrlBlackList
{
diff --git a/source/Glimpse.Core/Configuration/PluginDirectory.cs b/source/Glimpse.Core/Configuration/PluginDirectory.cs
new file mode 100644
index 000000000..de43c0c59
--- /dev/null
+++ b/source/Glimpse.Core/Configuration/PluginDirectory.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Linq;
+using System.Text;
+
+namespace Glimpse.Core.Configuration
+{
+ ///
+ /// Directory containing plugins
+ ///
+ public class PluginDirectory : ConfigurationElement
+ {
+ [ConfigurationProperty("directory")]
+ public string Directory
+ {
+ get
+ {
+ return this["directory"].ToString();
+ }
+ set { this["directory"] = value; }
+ }
+
+ public override string ToString()
+ {
+ return Directory;
+ }
+ }
+}
diff --git a/source/Glimpse.Core/Configuration/PluginDirectoryCollection.cs b/source/Glimpse.Core/Configuration/PluginDirectoryCollection.cs
new file mode 100644
index 000000000..ac5778e2b
--- /dev/null
+++ b/source/Glimpse.Core/Configuration/PluginDirectoryCollection.cs
@@ -0,0 +1,60 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Linq;
+using System.Text;
+
+namespace Glimpse.Core.Configuration
+{
+ public class PluginDirectoryCollection : ConfigurationElementCollection
+ {
+ public PluginDirectoryCollection()
+ {
+ BaseAdd(new PluginDirectory { Directory = "bin" });
+ }
+
+ public PluginDirectory this[int index]
+ {
+ get { return BaseGet(index) as PluginDirectory; }
+ set
+ {
+ if (BaseGet(index) != null)
+ {
+ BaseRemoveAt(index);
+ }
+ BaseAdd(index, value);
+ }
+ }
+
+ public void Add(PluginDirectory address)
+ {
+ BaseAdd(address);
+ }
+
+ public void Clear()
+ {
+ BaseClear();
+ }
+
+ protected override ConfigurationElement CreateNewElement()
+ {
+ return new PluginDirectory();
+ }
+
+ protected override object GetElementKey(ConfigurationElement element)
+ {
+ return element;
+ }
+
+ public IEnumerable DirectoryNames
+ {
+ get
+ {
+ foreach (PluginDirectory directory in this)
+ {
+ yield return directory.ToString();
+ }
+ }
+ }
+ }
+}
diff --git a/source/Glimpse.Core/Glimpse.Core.csproj b/source/Glimpse.Core/Glimpse.Core.csproj
index 0b76f3cbc..4ee38d886 100644
--- a/source/Glimpse.Core/Glimpse.Core.csproj
+++ b/source/Glimpse.Core/Glimpse.Core.csproj
@@ -78,6 +78,8 @@
+
+
diff --git a/source/Glimpse.Core/Module.cs b/source/Glimpse.Core/Module.cs
index 689c001b5..d75349d93 100644
--- a/source/Glimpse.Core/Module.cs
+++ b/source/Glimpse.Core/Module.cs
@@ -330,7 +330,7 @@ private void ComposePlugins()
{
var batch = new CompositionBatch();
- var directoryCatalog = new BlacklistedSafeDirectoryCatalog("bin", Configuration.PluginBlacklist.TypeNames());
+ var directoryCatalog = new BlacklistedSafeDirectoryCatalog(Configuration.PluginDirectories.DirectoryNames, Configuration.PluginBlacklist.TypeNames());
var container = new CompositionContainer(directoryCatalog);
container.ComposeParts(this, RequestValidator);
diff --git a/source/Glimpse.Core/Plumbing/BlacklistedSafeDirectoryCatalog.cs b/source/Glimpse.Core/Plumbing/BlacklistedSafeDirectoryCatalog.cs
index 70ab8b42b..ff8871182 100644
--- a/source/Glimpse.Core/Plumbing/BlacklistedSafeDirectoryCatalog.cs
+++ b/source/Glimpse.Core/Plumbing/BlacklistedSafeDirectoryCatalog.cs
@@ -14,34 +14,37 @@ internal class BlacklistedSafeDirectoryCatalog : ComposablePartCatalog
public IList Exceptions { get; private set; }
private IEnumerable TypesBlacklist { get; set; }
- public BlacklistedSafeDirectoryCatalog(string path, IEnumerable typesBlacklist)
+ public BlacklistedSafeDirectoryCatalog(IEnumerable paths, IEnumerable typesBlacklist)
{
Exceptions = new List();
TypesBlacklist = typesBlacklist;
- var files = Directory.EnumerateFiles(GetFullPath(path), "*.dll", SearchOption.AllDirectories);
-
AggregateCatalog = new AggregateCatalog();
- foreach (var file in files)
+ foreach (var path in paths)
{
- try
- {
- var assemblyCatalog = new AssemblyCatalog(file);
+ var files = Directory.EnumerateFiles(GetFullPath(path), "*.dll", SearchOption.AllDirectories);
- if (assemblyCatalog.Parts.ToList().Count > 0)
- AggregateCatalog.Catalogs.Add(assemblyCatalog);
- }
- catch (ReflectionTypeLoadException ex)
+ foreach (var file in files)
{
- foreach (var exception in ex.LoaderExceptions)
+ try
{
- Exceptions.Add(exception);
+ var assemblyCatalog = new AssemblyCatalog(file);
+
+ if (assemblyCatalog.Parts.ToList().Count > 0)
+ AggregateCatalog.Catalogs.Add(assemblyCatalog);
+ }
+ catch (ReflectionTypeLoadException ex)
+ {
+ foreach (var exception in ex.LoaderExceptions)
+ {
+ Exceptions.Add(exception);
+ }
+ }
+ catch (Exception ex)
+ {
+ Exceptions.Add(ex);
}
- }
- catch (Exception ex)
- {
- Exceptions.Add(ex);
}
}
}