1、RC中的FlowChart使用FlowSwitch<T>代替了FlowSwitch
描述:在Beta2中,活動工具欄上的FlowSwitch將生成一個非泛型FlowSwitch,在RC中生成泛型FlowSwitch<T>,修改的理由是非泛型FlowSwitch只允許string類型的 switch,FlowSwitch<T> 允許任何類型的switch。
用戶影響:在Beta2或者更早的版本WF設計器中使用了FlowSwitch創建的Flowchart,將不能在beta2之後的WF設計器中加載。
緩解:在Beta2 中如果你在Flowchart工作流中已經使用了FlowSwitch ,你需要手動的編輯flowchart的XAML,添加 x:TypeArguments="x:String"到FlowSwitch 節點,如下面代碼段Beta2:
<FlowSwitch Default="{x:Reference __ReferenceID2}" x:Name="__ReferenceID3" Expression="[variable1]">
<x:Reference>__ReferenceID0<x:Key>Ray</x:Key></x:Reference>
<x:Reference>__ReferenceID1<x:Key>Bill</x:Key></x:Reference>
</FlowSwitch>
RC:
<FlowSwitch x:TypeArguments="x:String" Default="{x:Reference __ReferenceID2}" x:Name="__ReferenceID3" Expression="[variable1]">
<x:Reference>__ReferenceID0<x:Key>Ray</x:Key></x:Reference>
<x:Reference>__ReferenceID1<x:Key>Bill</x:Key></x:Reference>
</FlowSwitch>
2、Literal <T>表達式中的引用的類型
描述:在WF中Literal表達式使用Literal<T>活動表示,在Beta2 中任何類型都能使用這個表達式。在RC中使用引用類型的實例初始化Literal<T> 是無效的。String是唯一的例外。做這種改變的動機是用戶錯誤的認為使用新的引用類型創建一個Literal<T> 要為每一個工作流實例創建新的引用類型。不允許 “Literal”使用引用類型消除這種混亂。在Beta2以下定義的工作流將跑不出錯誤。 在RC它將收到一個檢驗錯誤:
'Literal<List<String>>': Literal only supports value types and the immutable type System.String. The type System.Collections.Generic.List`1[System.String] cannot be used as a literal.
List<string> names = new List<string> {"Frank", "Joe", "Bob" };
Variable<List<string>> nameVar = new Variable<List<string>> { Default = new Literal<List<string>>(names)};
//Note: the following is the equivalent to the line above, the implicit cast creates a Literal<T> expression
//Variable<List<string>> nameVar = new Variable<List<string>> { Default = names };
DelegateInArgument<string> name = new DelegateInArgument<string>();
Activity program = new Sequence
{
Variables = { nameVar },
Activities =
{
new AddToCollection<string> {
Collection = new InArgument<ICollection<string>>(nameVar),
Item = new InArgument<string>("Jim")},
new ForEach<string>{
Values = new InArgument<IEnumerable<string>>(nameVar),
Body = new ActivityAction<string>{
Argument = name,
Handler = new WriteLine { Text = new InArgument<string>(name)}}}
}
};
用戶影響:已經在Literal<T>中使用引用類型的客戶需要使用另外一種不同類型表達式將引用類型放在工作流中使用。例如VisualBasicValue<T> 和LambdaValue<T>
Variable<List<string>> nameVar = new Variable<List<string>>{
Default = new VisualBasicValue<List<string>>("New List(Of String)(New String() {\"Frank\", \"Joe\", \"Bob\"})")};
DelegateInArgument<string> name = new DelegateInArgument<string>();
Activity program = new Sequence
{
Variables = { nameVar },
Activities =
{
new AddToCollection<string> {
Collection = new InArgument<ICollection<string>>(nameVar),
Item = new InArgument<string>("Jim")},
new ForEach<string>{
Values = new InArgument<IEnumerable<string>>(nameVar),
Body = new ActivityAction<string>{
Argument = name,
Handler = new WriteLine { Text = new InArgument<string>(name)}}}
}
};
3、TrackingRecord API中EventTime屬性類型的變化
描述:在 Beta2中,在 System.Activities.Tracking.TrackingRecord 裡面的EventTime 屬性是System.DateTimeOffset類型,Beta2 以後的版本類型改變成System.DateTime,在TrackingRecord發行時,EventTime屬性以UTC存儲時間。
public abstract class TrackingRecord {
…
public System.DateTime EventTime { get; }
…
}
用戶影響:用戶如果已經創建一個使用TrackingRecord對象自定義的參與者,訪問EventTime 屬性時需要更改類型,如果在執行跟蹤參與者的邏輯是從TrackingRecord指派EventTime屬性的,分配這個屬性的地方將獲得一個 DateTime類型而不是DateTimeOffset。
4、新的持久化影響:
描述:由於在實例模式和邏輯的巨大變化,從Beta 2到RC遷移持久化數據是不可能
用戶影響: 為了從RC升級到Beta2,放棄現有所有的實例並重新提交數據。另外,需要在不同的物理或虛擬機上安裝RC,不能安裝在使用過Beta 2的,而且需要設置一個不同的持久化數據庫。
5、總結:
WF4.0 RC 對 Beta2 的變化很小
參考文章:http://blogs.msdn.com/endpoint/archive/2010/02/10/4-0-beta2-rc-wcf-wf-breaking-changes.aspx