前面三篇把Xsd已经定义好了,这时,对组件开发者和组件使用者而言都已经知道xml将是一个什么样的了。但是组件的使用者依然无法全面开始工作,因为他们不知道如何让这个xml真正跑起来。

    因此,这一篇就讲一下,如何定义接口(这里的接口是泛义的接口。在这一篇的第一、第二节暂时忘了Xml)。

1.定义接口

    快速定义接口的方式,就是利用类关系图,创建接口:

image

    一开始,当然需要定义一个入口:

image

    定义一个Create方法:

image

    但是Create的返回类型还没定义:

image

    Engine自然要有执行方法:

image

    到这里,已经可以告诉组件的使用者,一切都准备好了,现在可以并行工作了。

2.定义更详细的接口

    当然,接口远还没有完成,来回想一下,前面三篇都引入了哪些概念:

  • Configuation
  • Slide
  • 各种Modification
  • Conditionable
  • 各种Expression
  • 各种Container
  • Variable
  • Statement
  • CliFunction

    这些可以进一步抽象成下面几个接口:

image

    但是,这里各种变量和参数都不知道如何传递,再补上一个执行上下文:

image

    当然,这个ExecutionContext可以有几种方式来保存Current值:

  • 如果在整个执行引擎的执行过程中不会出现多线程,那么ThreadStatic将是最佳选择
  • 如果会出现多线程,那么就不能用ThreadStatic,而要改用Context的方法保存

    无论选择哪种,目的仅仅是为了让ExecutionContext.Current在任何时候下都可以提供数据。

    最后,就是为了PInvoke而定义的CliFunction所需要的接口:

image

    所有的接口都完成了,就10个类型,是不是出奇的简单?

3.生成类型

    感谢xsd.exe这个工具,使大部分实现可以使用一个非常简单的命令来完成:xsd /c pptx.cnblogs.xsd

    这时xsd.exe就会生成一个pptx_cnblogs.cs的文件,先改名成pptx.cnblogs.cs,再把文件添加到工程中。在vs2008中打开文件,其内容如下:

image

    然后对这个文件做下面几个修改:

  • 添加namespace(除非确认默认namespace就是所需要的namespace)
  • 删除/注释DebuggerStepThroughAttribute(否则以后debug时会遇到麻烦)
  • 如果还需要做计算代码度量值,那么还要删除/注释GeneratedCodeAttribute

    仅仅利用这个文件,就可以非常简单的从xml反序列化成对象:

image

    在时间紧张的情况下,这是最方便快捷的方式(当然在第六篇里面将会说到这个方式的缺点,以及用其它方式读取xml)。

    现在,一切都已经准备就绪,下一篇就可以进入组件的编码阶段了。


上一篇:从写组件说Xml——Xsd篇(三)

下一篇:从写组件说Xml——实现(五)


posted on 2009-10-05 11:12  Zhenway  阅读(1338)  评论(0编辑  收藏  举报