前面三篇把Xsd已经定义好了,这时,对组件开发者和组件使用者而言都已经知道xml将是一个什么样的了。但是组件的使用者依然无法全面开始工作,因为他们不知道如何让这个xml真正跑起来。
因此,这一篇就讲一下,如何定义接口(这里的接口是泛义的接口。在这一篇的第一、第二节暂时忘了Xml)。
1.定义接口
快速定义接口的方式,就是利用类关系图,创建接口:
一开始,当然需要定义一个入口:
定义一个Create方法:
但是Create的返回类型还没定义:
Engine自然要有执行方法:
到这里,已经可以告诉组件的使用者,一切都准备好了,现在可以并行工作了。
2.定义更详细的接口
当然,接口远还没有完成,来回想一下,前面三篇都引入了哪些概念:
- Configuation
- Slide
- 各种Modification
- Conditionable
- 各种Expression
- 各种Container
- Variable
- Statement
- CliFunction
这些可以进一步抽象成下面几个接口:
但是,这里各种变量和参数都不知道如何传递,再补上一个执行上下文:
当然,这个ExecutionContext可以有几种方式来保存Current值:
- 如果在整个执行引擎的执行过程中不会出现多线程,那么ThreadStatic将是最佳选择
- 如果会出现多线程,那么就不能用ThreadStatic,而要改用Context的方法保存
无论选择哪种,目的仅仅是为了让ExecutionContext.Current在任何时候下都可以提供数据。
最后,就是为了PInvoke而定义的CliFunction所需要的接口:
所有的接口都完成了,就10个类型,是不是出奇的简单?
3.生成类型
感谢xsd.exe这个工具,使大部分实现可以使用一个非常简单的命令来完成:xsd /c pptx.cnblogs.xsd
这时xsd.exe就会生成一个pptx_cnblogs.cs的文件,先改名成pptx.cnblogs.cs,再把文件添加到工程中。在vs2008中打开文件,其内容如下:
然后对这个文件做下面几个修改:
- 添加namespace(除非确认默认namespace就是所需要的namespace)
- 删除/注释DebuggerStepThroughAttribute(否则以后debug时会遇到麻烦)
- 如果还需要做计算代码度量值,那么还要删除/注释GeneratedCodeAttribute
仅仅利用这个文件,就可以非常简单的从xml反序列化成对象:
在时间紧张的情况下,这是最方便快捷的方式(当然在第六篇里面将会说到这个方式的缺点,以及用其它方式读取xml)。
现在,一切都已经准备就绪,下一篇就可以进入组件的编码阶段了。
下一篇:从写组件说Xml——实现(五)