当前位置:编程学习 > asp >>

.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 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,