【C#进阶系列】【MEF框架(四)】

C#进阶系列

第四章 【C#进阶系列】【MEF框架(四)】
第三章 【C#进阶系列】【MEF框架(三)】
第二章 【C#进阶系列】【MEF框架(二)】
第一章 【C#进阶系列】【MEF框架(一)】



前言

在(一)已经对MEF作了基本的介绍,这里针对MEF的延迟加载、元数据作介绍。


一、延迟加载

Lazy<T, TMetadata> 是由 MEF 提供来保存对导出的间接引用的类型。 除了导出对象本身,你还可以获取导出元数据或描述导出对象的信息。

每个Lazy<T, TMetadata> 都包含一个代表实际操作的 IOperation 对象和一个代表元数据的 IOperationData 对象。

延迟加载在导出部件处的设置没什么变化,保持原有的设置即可。

在导入的时候,需要使用.NET提供的Lazy类来完成。

通过Lazy封装的对象即自动提供了延迟加载的机制。访问对象的方式也略微有所改变,当然不能直接通过属性(pro.Services_MathBook.GetBookName())进行访问,而是需要通过Lazy.Value(pro.Services_MathBook.Value.GetBookName())来访问,此属性值包含的即使延迟加载的对象。
另外Lazy.IsValueCreated属性提供了判断对象是否加载的功能,如果为true则表示对象已加载,否则为未加载。

namespace MEF_P1
{
    public interface IBookService
    {
        string BookName { get; set; }
        string GetBookName();
    }
    [Export("ContractName_MathBook", typeof(IBookService))]
    public class MathBook : IBookService
    {
        public string BookName { get; set; }
        public string GetBookName()
        {
            return "MathBook";
        }
    }
    [Export("ContractName_ChineseBook", typeof(IBookService))]
    public class ChineseBook : IBookService
    {
        public string BookName { get; set; }
        public string GetBookName()
        {
            return "ChineseBook";
        }
    }
    class Program
    {
        [Import("ContractName_MathBook", typeof(IBookService))]
        public Lazy<IBookService> Services_MathBook { get; set; }
        [Import("ContractName_ChineseBook", typeof(IBookService))]
        public Lazy<IBookService> Services_ChineseBook { get; set; }
        static void Main(string[] args)
        {
            Program pro = new Program();
            pro.Compose();
            if (pro.Services_MathBook != null)
            {
                Console.WriteLine(pro.Services_MathBook.Value.GetBookName());
            }
            if (pro.Services_ChineseBook != null)
            {
                Console.WriteLine(pro.Services_ChineseBook.Value.GetBookName());
            }
            Console.Read();
        }
        private void Compose()
        {
            //创建一个程序集目录,用于从一个程序集获取所有的组件定义
            AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
            //创建容器
            CompositionContainer container = new CompositionContainer(catalog);
            //组合部件:如果该类有Import,就会自动去寻找Export
            container.ComposeParts(this);
        }
    }
}

总结

依赖倒置原则:高层模板不应该依赖于底层模板,两者应该依赖于抽象,而抽象不应该依赖于细节。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于“c”的问题,需要进一步明确问题的具体内容。在数学中,“c”可能代表一些常数或系数,例如在一元一次方程中,c通常代表常数项;在求导中,c则代表常数函数的导数为零;在复数中,c则常用于表示实部。 在计算机领域中,C语言是一种广泛使用的编程语言,它具有高效、可移植、简洁等特点,成为了操作系统、网络、嵌入式系统等方面的主流开发语言。同时,“c”也是C语言代码中的一个标记符号,通常用于表示变量或函数名。 除此之外,在其他领域中,“c”也可能有不同的含义和用法。例如在物理学中,c代表光速常数;在化学中,c可能代表一种化合物的命名方式等。 综上所述,对于“c”的问题需要明确具体的语境和意义,才能准确回答。 ### 回答2: C是计算机科学中的一种编程语言,也是一种很常见的编程语言。它由美国贝尔实验室的丹尼斯·里奇在20世纪70年代初开发而成。 C语言具有简洁、高效的特点,被广泛应用于系统软件和应用软件开发中。C语言通过控制硬件资源和底层操作系统功能,提供了对计算机底层的直接访问能力,因此在开发操作系统、嵌入式系统和驱动程序等方面有着广泛的应用。 C语言的语法简洁明了,易于学习和理解。它具有结构化的特点,支持模块化的程序设计,程序可以分成多个独立的、可复用的模块,方便代码的维护和扩展。C语言还提供了丰富的库函数,开发者可以利用这些库函数快速实现各种功能。 C语言是编写高效代码的重要工具。由于C语言的语法和特性与机器语言非常接近,因此编写的程序在执行效率上非常高。C语言还可以直接调用汇编语言,利用汇编语言进行优化,进一步提高了程序的性能。 总之,C语言是一种重要的编程语言,广泛应用于计算机科学领域。其简洁、高效、灵活的特点使得它成为开发各种软件和系统的首选语言之一。对于想要从事编程领域的人来说,掌握C语言是一个重要的基础,可以帮助他们理解底层原理,提高程序的执行效率,实现各种功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值