《WF本质论》第一章OpenSesame我的实现
相关的背景可以看http://www.cnblogs.com/cloudjun/archive/2009/04/04/1429299.html,有机会的建议看书。
刚开始看这本书,第一次接触第一章的这写概念,代码省略的地方多了,看的感觉有点断层。网上初略的找了一下源代码,发现作者自己居然没有提供,能找到的其他实现都没有100%的实现,即不是一个真正可运行的示例代码。为了能够更深入的理解,我自己按照书中给出的轮廓做了一个自己的实现。我的实现中,并不是100%依照书中的描述,有一些是根据自己的理解改进的,比如我的实现中BookmarkManager类并没有Done方法,语句的状态,被定义到了ProgramStatement这个父类中,我认为Done这个动作是语句自身的状态的一种,和书签管理器本身没什么关联。书签的删除也从语句中移到了异步调用完毕(既ContinueAt方法调用之后),这样更合理,在书签管理器中删除书签。增加了一些书中提到的但是跳过的(常用理由:不是本章内容),比如BooleanExpression的实现(同样使用了代理来实现,顺带的及其简单的实现了数据绑定),BookmarkNotFoundException,钝化(使用System.Runtime.Serialization.Formatters.Binary来实现,目前发现.Net Framework也只有它能实现这个循环引用外带委托的类的序列化,其他的其中DataContractSerializer不支持循环引用,SOAP格式不支持委托,XML序列化没尝试,我想到DataContractSerializer内部似乎使用了XML序列化)等。还有一些改动是按照书中所述很难实现的改动,记不清楚是哪些地方了,这个示例代码陆陆续续的写了2个星期。
没有实现或完整实现的内容包括,最后的几张数据库表,因为实现解析器真不是本章内容了 :) ,我简单的使用了C#本身来代替。书中提到书签恢复之间的约束等(我感觉不是重点,而且加大了示例代码的复杂度),数据绑定等。
Program中假定了2种情况,一种是一次运行完毕(all),另一种是运行到需要输入的时候钝化(part1, part2),等待输入以后激活继续运行。实际上是可以在任何一个书签点钝化的,只不过OpenSesame中的逻辑中只有等待输入时候需要挂起,因此就按照这个逻辑设计了另外一种执行方式。
另外,Program中的书签是面向输入和Key一致的情况,如果输入和Key不一致会引发BookmarkNotFoundException,原因是PrintGreeting没有被执行,所以没办法恢复这个书签。这种情况应该是正常的,书签是由MythicalRuntime的客户端自己保管的,如果需要可以判断然后使用不同的书签,我的实现中没有提供对这种情况的支持。