封装:MEF组件式框架封装

一、简介: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();

        }
    }

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

五、设计结构图


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值