Skip to main content

CodeActivity ใน SharePoint 2013

Submitted by ezybzy on

หลังจากที่ 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 อีกที่ด้วย จึงดูเป็นหนทางที่เขาไม่แนะนำให้ทำจริง ๆ นะ (ท่ายาก)

Tags