zoukankan      html  css  js  c++  java
  • C# 高级编程9 第30章MEF C#可扩展编程之MEF第一章

    MEF(Managed Extensibility Framework)是一个用于创建可扩展的轻型应用程序的库

    利用该库轻松地封装代码,避免生成脆弱的硬依赖项。 通过 MEF,不仅可以在应用程序内重用扩展,还可以在应用程序之间重用扩展

    我的理解:应用/插件均使用约定好的协议(接口)进行开发。系统将自动扫描指定文件夹,并按协议自动导入。

    1.新建类库项目:BankInterface

    项目中添加接口:ICard,接口代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace BankInterface
    {
        public interface ICard
        {
            //账户金额
            double Money { get; set; }
            //获取账户信息
            string GetCountInfo();
            //存钱
            void SaveMoney(double money);
            //取钱
            void CheckOutMoney(double money);
        }
    }

    2.新建类库项目:BankOfChina,引用BankInterface

    项目中添加类:ZHCard,类代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ComponentModel.Composition;
    using BankInterface;
    
    namespace BankOfChina
    {
        [Export(typeof(ICard))]
        public class ZHCard : ICard
        {
            public string GetCountInfo()
            {
                return "Bank Of China";
            }
    
            public void SaveMoney(double money)
            {
                this.Money += money;
            }
    
            public void CheckOutMoney(double money)
            {
                this.Money -= money;
            }
    
            public double Money { get; set; }
        }
    }

    3.新建控制台项目:MEFDemo

    项目中添加类:Program,类代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Reflection;
    using System.ComponentModel.Composition;
    using System.ComponentModel.Composition.Hosting;
    using BankInterface;
    
    
    namespace MEFDemo
    {
        class Program
        {
            [ImportMany(typeof(ICard))]
            public IEnumerable<ICard> cards { get; set; }
    
            static void Main(string[] args)
            {
                Program pro = new Program();
                pro.Compose();
                foreach (var c in pro.cards)
                {
                    Console.WriteLine(c.GetCountInfo());
                }
    
    
                Console.Read();
            }
    
            private void Compose()
            {
                var catalog = new DirectoryCatalog("Cards");
                var container = new CompositionContainer(catalog);
                container.ComposeParts(this);
            }
        }
    }

    我们把生成的BankOfChian.dll拷贝到MEFDemo项目中的Bin/Debug的Cards这个文件夹下,然后运行才可以正确输出信息(毕竟我们没有引用那个项目)

    通常我们要改项目,把整个项目都编译再重新发布。但是现在不需要这么做了,我们只需要添加一个类库项目,把生成的dll拷贝到Cards目录下即可

    在这个解决方案下继续添加一个类库项目NongHang,新建一个类NongHang,,引用BankInterface,实现ICard接口,代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ComponentModel.Composition;
    using BankInterface;
    
    namespace NongHang
    {
        [Export(typeof(ICard))]
        public class NHCard : ICard
        {
            public string GetCountInfo()
            {
                return "Nong Ye Yin Hang";
            }
    
            public void SaveMoney(double money)
            {
                this.Money += money;
            }
    
            public void CheckOutMoney(double money)
            {
                this.Money -= money;
            }
    
            public double Money { get; set; }
        }
    }

    优点:

    1.利于应用程序内重用扩展,还可以在应用程序之间重用扩展

    2.项目发布和编译时不用再编译整个解决方案了

    3.实现了依赖注入的思想

  • 相关阅读:
    前端三剑客:html,css,JavaScript
    Python的开发之路
    python-win32操作excel的一些特殊功能
    pillow处理图片横向与纵向的合并
    部署django+uwsgi+Virtualenv+nginx+supervisor详细步骤
    python实现下载文件路径自动添加(1)的递增路径
    cx_Oracle连接oracle数据库
    pillow模块常用方法
    python内建集合模块collections功能,计数,有序,双向队列
    paramiko批量上传下载sftp,解决访问windows系列sftp乱码问题
  • 原文地址:https://www.cnblogs.com/licin/p/6626466.html
Copyright © 2011-2022 走看看