封装:MEF组件式框架封装

来源:互联网 发布:微信红包牛牛源码教程 编辑:程序博客网 时间:2024/06/03 15:05

一、简介:MEF框架是用于创建可扩展的轻型应用程序的库;


二、目的:对原生结构进行封装方便使用;

三、实现步骤:

 1、定义接口

    public interface IMefDemoBase    {        void Init();    }

2、实现接口和特性

    /// <summary> ① 必须拥有Export特性  [Export(typeof(IMefDemoBase))] </summary>    [Export(typeof(IMefDemoBase))]    public class MefDemoBase : IMefDemoBase    {        public void Init()        {            throw new NotImplementedException();        }    }


3、 构建组件集合

    /// <summary> 提供构建组件集合 </summary>    public class MefEntityProvider<T>    {       // ② 必须拥有Export特性  [Export(typeof(IMefDemoBase))]        [ImportMany]        List<T> doList;        /// <summary> 获取所有接口 </summary>        public List<T> DoList        {            get { return doList; }            set { doList = value; }        }        /// <summary> 通过一组应用程序集创建一个MefEntityProvider </summary>        public static MefEntityProvider<T> CreateInstance(List<Assembly> asses)        {            //  ③ 必须拥有Export特性  [Export(typeof(IMefDemoBase))]            MefEntityProvider<T> provider = new MefEntityProvider<T>();            var catalog = new AggregateCatalog();            asses.ForEach(l => catalog.Catalogs.Add(new AssemblyCatalog(l)));            var _container = new CompositionContainer(catalog);            _container.ComposeParts(provider);            return provider;        }        /// <summary> 通过一个应用程序集创建一个MefEntityProvider </summary>        public static MefEntityProvider<T> CreateInstance(Assembly ass)        {            MefEntityProvider<T> provider = new MefEntityProvider<T>();            var catalog = new AggregateCatalog();            catalog.Catalogs.Add(new AssemblyCatalog(ass));            var _container = new CompositionContainer(catalog);            _container.ComposeParts(provider);            return provider;        }    }

四、实现实例

    class Program    {        static void Main(string[] args)        {            List<Assembly> ass = new List<Assembly>();            ass.Add(Assembly.GetEntryAssembly());            MefEntityProvider<IMefDemoBase> provider = MefEntityProvider<IMefDemoBase>.CreateInstance(ass);            provider.DoList.ForEach(l => Console.WriteLine(l.ToString()));            Console.Read();            MefEntityProvider<IDisposable> provider1 = MefEntityProvider<IDisposable>.CreateInstance(ass);            provider1.DoList.ForEach(l => Console.WriteLine(l.ToString()));            Console.Read();        }    }

注:此结构会在加载的程序集中自动找到自定义的接口,实现动态加载

五、设计结构图


0 0