.Net插件框架的实现及分析(二)
呵,很久之前发表了 .Net插件框架的实现及分析(一) ,只是一直没在此接上,只是在我自己的代码部落里更新了,现在也加上吧:
话接上回, 让我们来继续分析下这个插件框架如何实现吧。既然是插件,就必须得动态加载,只需将编译好的插件DLL文件放到指定的插件目录下就可以使用了,这样就有一个动态获取插件的过程,我们此例中为文章内容格式化插件,当然就不只一个格式化插件在同一时间里使用了,所以需先创建的一个集合来收集这些插件:
ProviderCollector.cs 文件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CoderBlog.Core
{
/// <summary>
/// 实现一个泛型插件 Provider 集合
/// </summary>
/// <typeparam name="T">集合类型.</typeparam>
public class ProviderCollector<T>
{
private List<T> list;
/// <summary>
/// 初始化新的实体
/// </summary>
public ProviderCollector()
{
list = new List<T>(3);
}
/// <summary>
/// 添加一个 Provider 到集合
/// </summary>
/// <param name="provider">需添加的 Provider.</param>
public void AddProvider(T provider)
{
lock (this)
{
list.Add(provider);
}
}
/// <summary>
/// 从集合里移除一个 Provider
/// </summary>
/// <param name="provider">需移除的 Provider</param>
public void RemoveProvider(T provider)
{
lock (this)
{
list.Remove(provider);
}
}
/// <summary>
/// 获取所有的 Providers (返回数组).
/// </summary>
public T[] AllProviders
{
get
{
lock (this)
{
return list.ToArray();
}
}
}
/// <summary>
/// 获取一个 Provider, 按类型名称搜索
/// </summary>
/// <param name="typeName">类型名称</param>
/// <returns>所找到的 Provider</returns>
public T GetProvider(string typeName)
{
lock (this)
{
for (int i = 0; i < list.Count; i++)
{
if (list[i].GetType().FullName.Equals(typeName)) return list[i];
}
return default(T);
}
}
}
}
然后还要创建一个管理插件 Provider 集合实例的类:
Collectors.cs 文件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CoderBlog.PluginFramework;
namespace CoderBlog.Core
{
/// <summary>
/// 包含了 Providers 集合的实例
/// </summary>
public static class Collectors
{
/// <summary>
/// Contains the file names of the DLLs containing each provider (provider->file).
/// </summary>
public static Dictionary<string, string> FileNames;
/// <summary>
/// 使用中的格式化插件的 Provider 集合
/// </summary>
public static ProviderCollector<IFormatterProvider> FormatterProviderCollector;
/// <summary>
/// 禁用中的格式化插件的 Provider 集合
/// </summary>
public static ProviderCollector<IFormatterProvider> DisabledFormatterProviderCollector;
/// <summary>
/// 查找一个 provider.
/// </summary>
/// <param name="typeName">
补充:Web开发 , ASP.Net ,