หลังจากที่ Microsoft ได้ปล่อยเครื่องมือพัฒนา Office Apps รุ่น Final (เสียที) ก็ได้มีโอกาสมาทดลองความเปลี่ยนแปลง ประกอบกับได้อ่านบทแจกฟรีของหนังสือ Real World .NET C# and Silverlight ของ Wrox ก็เลยได้ลองมาทำ CodeActivity แบบง่าย ๆ ขึ้นมา
ขั้นแรกคือสร้างโปรเจค SharePoint ขึ้นมาเป็นแบบ Farm Solution ต่อจากนั้นเพิ่ม Item ใหม่เป็น Code Activity (อยู่ใน Item กลุ่ม Workflow ไม่ใช่ Office/SharePoint) จากนั้นเราจะได้ sealed class
แบบ CodeActivity
ซึ่งจากตรงนี้ เราจะเปลี่ยนไปใช้ AsyncCodeActivity
หรือ NativeCodeActivity
ก็ตามแต่ความเหมาะสม
ใน Template นี้จะให้ properties แบบ InArgument
มาให้ 1 ตัวเพื่อใช้รับค่าที่ส่งมายัง Activity นี้ พร้อมทั้งให้ method ชื่อ Execute
ซึ่งมีบรรทัดตัวอย่างการอ่านค่ามายังตัวแปรข้างต้นให้เรา
ณ จุดนี้มีสิ่งที่ต้องระมัดระวังคือ เนื่องจาก Workflow ของเราไม่ได้ทำงานอยู่ใน SharePoint แบบแต่ก่อนแล้วแต่ไปทำงานบน AppFabric แทน ทำให้ CodeActivityContext
ไม่มีค่าอะไรเกี่ยวกับ SharePoint มาให้ทั้งสิ้น จึงต้องคิดให้ดีว่าจะจัดการหาค่าเหล่านั้นมาจากทางใด ทางที่ง่ายที่สุดน่าจะเป็นการรับผ่าน InArgument
นั่นเอง และจากที่ Workflow Custom Activity template ที่มีให้ในเครื่องมือพัฒนา ผมเห็นตัวที่น่าสนใจตัวเดียวคือ WebUri (string)
เมื่อทำการเขียน Code เสร็จ (จริง ๆ ถ้าชอบเขียนเป็นแนว Declarative ก็สามารถใช้ class แบบ Activity
ก็ได้ เพราะ Microsoft ก็ทำแบบนั้นเหมือนกัน) ทำการ Build 1 รอบ แล้วเพิ่ม Item แบบ Workflow Custom Activity เราจะพบ class ที่เราเพิ่งสร้างเมื่อซักครู่ปรากฎอยู่ใน Toolbox หลังจากนี้ก็แค่เขียนไฟล์ actions4 ให้เรียบร้อย ทำการสร้าง FeatureActivated
ให้กับ Feature ให้แก้ web.config ให้ก็น่าจะเป็นอันจบพิธี
แต่เหมือนจะไม่เป็นเช่นนั้น ผมเจอ error ตัวหนึ่งที่ยังไม่มีเวลาหาทางแก้ นั่นคือ
Could not find type 'className' in namespace 'wf://workflow.windows.net/$Current/$Activities'.
ถ้ามีเวลาค่อยมาดูต่อว่าต้องทำอย่างไร แต่จากการได้ดูสไลด์งาน SPC2012 ก็พบว่า แค่ Deploy ลง GAC นั้นยังไม่พอ เราต้องเอา Assembly ชุดนี้ไปวางบน AppFabric อีกที่ด้วย จึงดูเป็นหนทางที่เขาไม่แนะนำให้ทำจริง ๆ นะ (ท่ายาก)