ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C# MEF 通用插件框架

2022-04-26 13:35:01  阅读:159  来源: 互联网

标签:插件 MEF string get C# Mark new public


首先看下接口约定:
namespace PluginContract
{
    public interface IPlugin
    {
        string Name { get; set; }
        void SayHello();
    }
    public interface IPluginMark
    {
        string Mark { get; }
    }
}

自动加载插件类:

    public class PlugerBase<T>
    {
        public T GetClass(string className)
        {
            if (Names.Contains(className))
            {
                var plug = DoPluginList.Where(i => i.Metadata.Mark == className).Select(p => p.Value).FirstOrDefault();
                return (T)plug;
            }
            else
            {
                return default(T);
            }
        }
        public string[] Names
        {
            get
            {
                List<string> name = new List<string>();
                foreach (var item in DoPluginList)
                {
                    name.Add(item.Metadata.Mark);
                }
                return name.ToArray();
            }
        }
        /// <summary>
        /// 插件列表
        /// </summary>
        [ImportMany]
        private List<Lazy<T, IPluginMark>> DoPluginList = new List<Lazy<T, IPluginMark>>();
        public PlugerBase(string subFolderName="Plug")
        {
            Directory.CreateDirectory(Environment.CurrentDirectory + "\\"+ subFolderName);
            var catelog = new AggregateCatalog();
            AssemblyCatalog assemblyCataLog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
            catelog.Catalogs.Add(new DirectoryCatalog(subFolderName));
            var container = new CompositionContainer(catelog);
            container.ComposeParts(this);
        }
    }
插件端: 第一个:
namespace MEF_Demo//第一个插件实现的插件需要被调用应用的命名空间一致,切记
{
    [ExportMetadata("Mark", "2")]//Mark需要和接口名称同步IPluginMark.后面的2便是GetClass(string className)的className
    [Export(typeof(IPlugin))]
    public class PluginFirst : IPlugin
    {
        public string Name { get; set; } = "张三";
 
        public void SayHello()
        {
            MessageBox.Show($"你好啊{Name}");
        }
    }
}

第二个:

namespace MEF_Demo
{
    [ExportMetadata("Mark","1")]
    [Export(typeof(IPlugin))]
    public class PluginSecod : IPlugin
    {
        public string Name { get; set; } = "李四";
        public void SayHello()
        {
            MessageBox.Show($"你好啊{Name}");
        }
    }
}

最后调用时非常简单:

 public MainWindow()
 {
    InitializeComponent();
    PlugerBase<IPlugin> plug = new PlugerBase<IPlugin>();//编译好的插件需要放置在Plug文件夹内
    var d= plug.GetClass("1");//通过名称直接反射出对应的类
    d.SayHello();
 }  

 

标签:插件,MEF,string,get,C#,Mark,new,public
来源: https://www.cnblogs.com/SF8588/p/16194388.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有