我建立我的應用程序插件架構。插件實現給定的接口IBasePlugin,或一些其它接口,其從所述基部接口繼承:
interface IBasePlugin
interface IMainFormEvents : IBasePlugin
主機加載插件組件,然後創建任何類的適當的對象執行IBasePlugin接口..
這是類加載插件和實例的對象:
public class PluginCore
{
#region implement singletone instance of class
private static PluginCore instance;
public static PluginCore PluginCoreSingleton
{
get
{
if (instance == null)
{
instance = new PluginCore();
}
return instance;
}
}
#endregion
private List<Assembly> _PlugInAssemblies = null;
/// <summary>
/// Gets the plug in assemblies.
/// </summary>
/// <value>The plug in assemblies.</value>
public List<Assembly> PlugInAssemblies
{
get
{
if (_PlugInAssemblies != null) return _PlugInAssemblies;
// Load Plug-In Assemblies
DirectoryInfo dInfo = new DirectoryInfo(
Path.Combine(
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
"Plugins"
)
);
FileInfo[] files = dInfo.GetFiles("*.dll");
_PlugInAssemblies = new List<Assembly>();
if (null != files)
{
foreach (FileInfo file in files)
{
_PlugInAssemblies.Add(Assembly.LoadFile(file.FullName));
}
}
return _PlugInAssemblies;
}
}
List<IBasePlugin> _pluginsList = null;
/// <summary>
/// Gets the plug ins instances.
/// all the plugins are being instanciated ONCE when this if called for the first time
/// every other call will return the existing classes.
/// </summary>
/// <value>The plug ins instances.</value>
public List<IBasePlugin> PlugInInstances
{
get
{
if (_pluginsList != null) return _pluginsList;
List<Type> availableTypes = new List<Type>();
foreach (Assembly currentAssembly in this.PlugInAssemblies)
availableTypes.AddRange(currentAssembly.GetTypes());
// get a list of objects that implement the IBasePlugin
List<Type> pluginsList = availableTypes.FindAll(delegate(Type t)
{
List<Type> interfaceTypes = new List<Type>(t.GetInterfaces());
return interfaceTypes.Contains(typeof(IBasePlugin));
});
// convert the list of Objects to an instantiated list of IBasePlugin
_pluginsList = pluginsList.ConvertAll<IBasePlugin>(delegate(Type t) { return Activator.CreateInstance(t) as IBasePlugin; });
return _pluginsList;
}
}
問題
目前,它支持任何插件模塊,採用PlugInInstances屬性檢索IBasePlugins名單。然後它迭代查詢誰在實現給定子接口的對象。
foreach (IBasePlugin plugin in PluginCore.PluginCoreSingleton.PlugInInstances)
{
if (plugin is IMainFormEvents)
{
// Do something
}
}
我想通過接收給定子接口的函數來改進這種技術,並返回這些接口的列表。問題是調用者不應該執行任何投射。
僞代碼:
void GetListByInterface(Type InterfaceType, out List<InterfaceType> Plugins)
你有一個建議,如何實現這一點?
您是否考慮過使用Microsoft的Managed Extensibility Framework? //www.codeplex.com/MEF – TrueWill 2009-10-13 22:29:14
@TrueWill:我會研究它 – Amirshk 2009-10-13 22:33:34
@TrueWill:我的代碼完全在家裏做。我會在幾個小時後看看。 – 2009-10-13 22:45:07