MEF只导出类的成员

通过前面两篇文章的介绍,相信各位会明白MEF中有不少实用价值。上一文中我们也讨论了导入与导出,对于导出导入,今天我们再深入一点点,嗯,只是深入一点点而已,不会很难的,请大家务必放心,如果大家觉得看文章枯燥,不妨一边喝牛奶一边阅读。

上一文中我们都是把整个类型(整个类)进行导出,不过有时候,我们可能会考虑只导出类的某些成员,比如某个属性或某个字段等。

我们还是少说理论,免得大家喝不下牛奶,还是直接上菜吧。为了便于测试,以下示例把组件都写在当前程序集中,也就是在同一个项目,然后用AssemblyCatalog来查找。

首先,定义一个公共接口IWork。

然后分别用两个类来实现该接口。

接着,我们再定义一个总类,包含两个属性,分别返回FirstWork类和SecondWork类的实例。

ExportAttribute特性只附加在WorkFirst和WorkSecond两个属性上,Works类只导出这两个属性。

随后,我们组装并调用这些导出部件。

然后我们运行一下示例,就可以得到如下图所示的结果:

很多人学习编程很喜欢直接Ctrl + C别人的代码,这是一种相当不好的学习方法,所以我把代码都弄成截图了,哈哈。

我事前在导入字段声明时用了Lazy<T>,但发现不能创建对象,可能的原因是我们导出的是类的一部分,内部运行时在组装部件时需要Works类进行实例化,因为如果Works对象不实例化的话,就导不出WorkFirst和WorkSecond属性了。也许是这个原因导致的吧。

这时候大家可能会想,如果我在Works类中定义一个方法,我想导出这个方法怎么办?

既然想到了还等什么,马上试试就知道了,我们把Works类的代码改一下,导出一个ViewWork方法。

协定类型为什么使用Func<TResult>呢?为什么,大家好好思考一下,用什么方式来表示方法的签名与形式最形象?想想吧。

接着我们在Program类中导入这个方法。

导入的协定名与协定类型一定要与导出匹配,否则无法导入。这就好比你的言行要匹配一样,否则妹子不会理你。

在完成组装的代码后面,我们测试调用导入的方法。

然后运行一下,看看有没有结果。

不过,最后,还是把完整的代码贴一下。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.ComponentModel.Composition;

using System.ComponentModel.Composition.Hosting;

using System.Reflection;

namespace MefApp

{

// 作为公共接口

public interface IWork

{

void DoSome();

string WName { get; }

}

// 第一个实现公共接口的类

public class FirstWork : IWork

{

public void DoSome()

{

Console.WriteLine("工序一执行。");

}

public string WName

{

get { return "工序一"; }

}

}

// 第二个实现公共接口的类

public class SecondWork : IWork

{

public void DoSome()

{

Console.WriteLine("工序二执行。");

}

public string WName

{

get { return "工序二"; }

}

}

// 只对成员进行导出的类

public class Works

{

FirstWork fw;

SecondWork sw;

public Works()

{

// 初始化

fw = new FirstWork();

sw = new SecondWork();

}

// 该属性被导出

[Export("work 1", typeof(IWork))]

public IWork WorkFirst { get {

return fw;

} }

// 该属性被导出

[Export("work 2", typeof(IWork))]

public IWork WorkSecond

{

get { return sw; }

}

// 导出方法

[Export("view work", typeof(Func<string>))]

public string ViewWork()

{

return "本生产线国际一流,由3172个工作单元组成,73265道工序。";

}

}

class Program

{

// 导入

[Import("work 1", typeof(IWork))]

public IWork TheImportFirstWork;

// 导入

[Import("work 2", typeof(IWork))]

public IWork TheImportSecondWork;

// 导入

[Import("view work", typeof(Func<string>))]

public Func<string> TheImportViewWorkMethod;

static void Main(string[] args)

{

// 从当前程序集中发现组件

AssemblyCatalog cat = new AssemblyCatalog(typeof(Program).Assembly);

Program p = new Program();

CompositionContainer container = new CompositionContainer(cat);

container.SatisfyImportsOnce(p);//给合

// 调用测试

if (p.TheImportFirstWork!=null)

{

Console.Write("类型名:{0} Name:{1} 调用结果:",

p.TheImportFirstWork.GetType().Name,

p.TheImportFirstWork.WName);

p.TheImportFirstWork.DoSome();

}

if (p.TheImportSecondWork != null)

{

Console.Write("类型名:{0} Name:{1} 调用结果:",

p.TheImportSecondWork.GetType().Name,

p.TheImportSecondWork.WName);

p.TheImportSecondWork.DoSome();

}

if (p.TheImportViewWorkMethod != null)

{

Console.WriteLine(p.TheImportViewWorkMethod());

}

// 释容器以及其创建的实例

container.Dispose();

Console.Read();

}

}

}

 
 
 
标签: MEF

MEF只导出类的成员的更多相关文章

  1. 实战MEF(3):只导出类的成员

    通过前面两篇文章的介绍,相信各位会明白MEF中有不少实用价值.上一文中我们也讨论了导入与导出,对于导出导入,今天我们再深入一点点,嗯,只是深入一点点而已,不会很难的,请大家务必放心,如果大家觉得看文章 ...

  2. C#可扩展编程之MEF学习笔记(三):导出类的方法和属性

    前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...

  3. C#可扩展编程之MEF(三):导出类的方法和属性

      前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经 ...

  4. C#可扩展编程之MEF学习笔记(二):MEF的导出(Export)和导入(Import)

    上一篇学习完了MEF的基础知识,编写了一个简单的DEMO,接下来接着上篇的内容继续学习,如果没有看过上一篇的内容, 请阅读:http://www.cnblogs.com/yunfeifei/p/392 ...

  5. VC++导入导出类

    一.导出类 VC++中导出类很简单,下面列出了两个等价的方法: 方法1: class __declspec(dllexport) CTest { public: int        m_nValue ...

  6. Effective Java 第三版——15. 使类和成员的可访问性最小化

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  7. DLL导出类避免地狱问题的完美解决方案

    DLL动态链接库是程序复用的重要方式,DLL可以导出函数,使函数被多个程序复用,DLL中的函数实现可以被修改而无需重新编译和连接使用该DLL的应用程序.作为一名面向对象的程序员,希望DLL可以导出类, ...

  8. (转)C++类库开发之导出类设计原则

    上一篇博客详细陈述了类库开发的各个知识点(http://blog.csdn.net/z702143700/article/details/45989993),本文将进一步陈述,对于类库开发过程中导出类 ...

  9. EffectiveJava(13)使类和成员的可访问性最小化

    1.为什么要使类和成员可访问性最小化 它可以有效地解除组成系统的各模块之间的耦合关系,使得这些模块可以独立的开发 测试 优化 使用 理解和修改.提高软件的可重用性 2.成员的访问级别 私有(priva ...

随机推荐

  1. [注意事项&amp;车轮]java源代码 产生局部javadoc api档

    随着Eclipse书写java码时间,有时候,因为我们不知道java函数返回.通过鼠标移动到java该功能,假设它javadoc相关内容将被显示. 但是,并非所有java代码javadoc:连装jav ...

  2. HDU多赛学校9 HDU4969 Just a Joke 【数学积分】

    数学题目 意甲冠军:的男孩向圆上的女孩跑去,保持男孩女孩圆心在同一条直线上.这过程中,男孩女孩均匀速 给出男孩女孩速度,圆的半径,男孩最长能跑的距离 问男孩是否能跑到女孩那里 能够用积分来解这道题,我 ...

  3. poj 2828 Buy Tickets(树状数组 | 线段树)

    题目链接:poj 2828 Buy Tickets 题目大意:给定N,表示有个人,给定每一个人站入的位置,以及这个人的权值,如今按队列的顺序输出每一个人的权值. 解题思路:第K大元素,非常巧妙,将人入 ...

  4. F4107Usart数据处理程序

    解决:Cortex-M4上,usart自己主动发送数据计划. 1. usart快速突破.数据还没有被处理.usart中断会把盖掉的数据不被处理. 数据丢失. 2.此过程需要main处理4一个usart ...

  5. DDD分层架构的进化

    .NET逻辑分层架构演示:DDD分层架构的进化 概述:   架构是高层的设计,如果设计和理解有误,必将在实现时带来各种问题.架构又是最稳定的,不会因为各种具体技术的依赖,如各种UI框架.ORM框架.I ...

  6. WebApi及Fiddler工具

    WebApi及Fiddler工具 1.概述 曾经有人问:asp.net mvc和asp.net webapi区别在哪?这个其实不好回答的.可能因为mvc模式盛行的原因,webapi显得孤芳自赏了,让人 ...

  7. ultraEdit-32 PHP/HTML智能提示

    原文 ultraEdit-32 PHP/HTML智能提示 高级–>配置–>编辑器–>自动完成–>勾选自动显示……选项,在下面输入框中输入你要求输出多个字符才出现提示,比如 ec ...

  8. php rsa 加密、解密、签名、验签

    由于对接第三方机构使用的是Java版本的rsa加解密方法,所有刚开始在网上搜到很多PHP版本的rsa加解密,但是对接java大多都不适用. 以下php版本是适用于对接java接口,java适用密钥再p ...

  9. PHP 生成唯一激活码

    <?php /** * 从来没有产生一个唯一的激活码 * @return string */ function create_guid($namespace = null) { static $ ...

  10. [翻译]如何编写GIMP插件(二)

    写在前面: 本人翻译并不专业,甚至英语不好,翻译内容仅供参考.由于博主是边学边翻译,所以不能保证翻译的准确性和正确性,如果可以,请查看原版学习,本文仅作学习记录之用. <How to write ...