Files
Disco/Disco.Services/_Plugins/PluginDefinition.cs
T
2013-02-01 12:35:28 +11:00

87 lines
4.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Web.Mvc;
namespace Disco.Services.Plugins
{
public class PluginDefinition
{
public string Id { get; private set; }
public string Name { get; private set; }
public string Author { get; private set; }
public Version Version { get; private set; }
public Type PluginType { get; private set; }
public Type PluginCategoryType { get; private set; }
public Dictionary<string, string> PluginReferenceAssemblies { get; private set; }
public string PluginHostDirectory { get; private set; }
public bool HasConfiguration { get; private set; }
public bool HasWebController { get; private set; }
public PluginDefinition(Plugin PluginInstance, string HostDirectory, Dictionary<string, string> ReferencedAssemblies = null)
{
Type pluginType = PluginInstance.GetType();
if (string.IsNullOrWhiteSpace(PluginInstance.Id))
throw new ArgumentNullException("PluginInstance.Id");
if (string.IsNullOrWhiteSpace(PluginInstance.Name))
throw new ArgumentNullException("PluginInstance.Name");
if (string.IsNullOrWhiteSpace(PluginInstance.Author))
throw new ArgumentNullException("PluginInstance.Author");
if (string.IsNullOrWhiteSpace(HostDirectory))
throw new ArgumentNullException("HostDirectory");
if (PluginInstance.Version == null)
throw new ArgumentNullException("PluginInstance.Version");
if (PluginInstance.PluginCategoryType == null)
throw new ArgumentNullException("PluginInstance.PluginCategoryType");
if (!PluginInstance.PluginCategoryType.IsAssignableFrom(pluginType))
throw new ArgumentException(string.Format("The plugin [{0}] does not inherit the Category [{1}]", pluginType.Name, PluginInstance.PluginCategoryType.Name), "PluginInstance.PluginCategoryType");
this.Id = PluginInstance.Id;
this.Name = PluginInstance.Name;
this.Author = PluginInstance.Author;
this.Version = PluginInstance.Version;
this.PluginType = pluginType;
this.PluginCategoryType = PluginInstance.PluginCategoryType;
this.PluginHostDirectory = HostDirectory;
if (ReferencedAssemblies != null && ReferencedAssemblies.Count > 0)
this.PluginReferenceAssemblies = ReferencedAssemblies;
// Determine (and Validate) if has Configuration
IPluginConfiguration pluginConfiguration = PluginInstance as IPluginConfiguration;
if (pluginConfiguration != null)
{
if (pluginConfiguration.ConfigurationViewType == null)
throw new ArgumentNullException("PluginInstance.ConfigurationViewType");
if (!typeof(WebViewPage).IsAssignableFrom(pluginConfiguration.ConfigurationViewType))
throw new ArgumentException(string.Format("The plugin [{0}] ConfigurationViewType must inherit System.Web.Mvc.WebViewPage", pluginType.Name), "PluginInstance.ConfigurationViewType");
this.HasConfiguration = true;
}
// Determine if has Web Controller
IPluginWebController pluginWebController = PluginInstance as IPluginWebController;
this.HasWebController = (pluginWebController != null);
}
public Plugin CreateInstance()
{
return (Plugin)Activator.CreateInstance(PluginType);
}
public PluginType CreateInstance<PluginType>()
{
if (typeof(PluginType).IsAssignableFrom(this.PluginType))
return (PluginType)Activator.CreateInstance(this.PluginType);
else
throw new InvalidOperationException(string.Format("The plugin [{0}] cannot be cast into type [{1}]", this.PluginType.Name, typeof(PluginType).Name));
}
}
}