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.实现了依赖注入的思想

原文地址:https://www.cnblogs.com/licin/p/6626466.html