MEF编程-【2.使用自定义导出特性(Using a Custom Export Attribute)】

接上上一篇,我们再看看如何使用自定义导出特性

银行相关接口如图所示

【注意:使用强类型元数据(Using Strongly-typed Metadata)为了访问强类型的元数据,通过定义匹配只读属性(名称和类型)的接口创建元数据视图。下图中的IMetaData接口】

public interface ICard
{
    //账户金额
    double Money { get; set; }

    //获取账户信息
    string GetCountInfo();
        
    //存钱
    void SaveMoney(double money);
        
    //取钱
    void CheckOutMoney(double money);
}

public interface IMetaData
{
    string CardType { get; }
}

为了使用比 ExportMetadata 更强类型,需要创建自定义特性 [System.ComponentModel.Composition.MetadataAttribute] 标识。

/// <summary>
/// AllowMultiple = false,代表一个类不允许多次使用此属性
/// </summary>
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class ExportCardAttribute : ExportAttribute
{
    public ExportCardAttribute() : base(typeof(ICard))
    {
    }

    public string CardType { get; set; }
}

我们定义两个银行操作实现类:

[ExportCardAttribute(CardType = "BankOfChina")]
public class ZHCard:ICard
{
        public double Money { get; set; }
        public string GetCountInfo()
        {
            return "Bank Of China";
        }

        public void SaveMoney(double money)
        {
            this.Money += money;
        }

        public void CheckOutMoney(double money)
        {
            this.Money -= money;
        }
}
[ExportCardAttribute(CardType = "BankOfAgricultural")]
class NHCard : ICard
{
        public double Money { get; set; }

        public void CheckOutMoney(double money)
        {
            this.Money -= money;
        }

        public string GetCountInfo()
        {
            return "Agricultural Bank Of China";
        }

        public void SaveMoney(double money)
        {
            this.Money += money;
        }
}

那怎么导出使用呢?还下面事例代码,这里我是控制台程序

        //其中AllowRecomposition=true参数就表示运行在有新的部件被装配成功后进行部件集的重组.
        [ImportMany(AllowRecomposition = true)]
        public IEnumerable<Lazy<ICard, IMetaData>> cards { get; set; }


        static void Main(string[] args)
        {
            Program pro = new Program();
            pro.Compose();
            /*
            foreach (var c in pro.cards)
            {
                Console.WriteLine(c.GetCountInfo());
            }
            */
            foreach (var c in pro.cards)
            {
                if (c.Metadata.CardType == "BankOfChina")
                {
                    Console.WriteLine("Here is a card of Bank Of China ");
                    Console.WriteLine(c.Value.GetCountInfo());
                }
                if (c.Metadata.CardType == "BankOfAgricultural")
                {
                    Console.WriteLine("Here is a card of Nong Ye Yin Hang ");
                    Console.WriteLine(c.Value.GetCountInfo());
                }
            }

            Console.Read();
        }

        private void Compose()
        {
            var catalog = new DirectoryCatalog("Cards");
            var container = new CompositionContainer(catalog);
            container.ComposeParts(this);
        }

这样就可以OK了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值