Bên cạnh việc sử dụng các activity có sẵn trong WF4, chúng ta có thể xây dựng thêm các custom activity tương ứng với các yêu cầu đặc biệt.
Kế thừa từ Activity<TResult>
Để xây dựng một custom activity, chúng ta có thể kế thừa từ class Activity<TResult>. Ở đây chúng ta sẽ xây dựng một custom activity là AppendString thực hiện việc kết nối 2 chuỗi lại với nhau.
Code Snippet
- public sealed class AppendString : Activity<string>
- {
- public AppendString()
- {
-
- }
- }
AppendString activity cần đưa vào 2 string để thực hiện việc ghép nối và trả về string đã ghép nối. Để thực hiện cho phép đưa vào custom activity, chúng ta cần 2 InArgument và 2 argument này là bắt buộc.
Code Snippet
- public sealed class AppendString : Activity<string>
- {
- [RequiredArgument]
- public InArgument<string> TheFirstStr { get; set; }
-
- [RequiredArgument]
- public InArgument<string> TheSecondStr { get; set; }
-
- public AppendString()
- {
-
- }
- }
Đối với các custom activities thừa kế từ Activity<TResullt>, để định nghĩa phần logic code của activity, chúng ta sẽ thông qua property Implementation, thông qua property này, chúng ta sẽ định nghĩa 1 delegate để thực hiện logic code cho activity.
Code Snippet
- public AppendString()
- {
- // Define the implementation for AppendString activity
- this.Implementation = () => new Assign<string>()
- {
- Value = new InArgument<string>(context => TheFirstStr.Get(context)
- + TheSecondStr.Get(context)),
- To = new OutArgument<string>(context => this.Result.Get(context))
- };
- }
Sau khi đã định nghĩa xong custom activity AppendString, chúng ta tiến hành kiểm tra kết quả thu được thông qua method sau
Code Snippet
- static void AppendStringDemo()
- {
- // Initialize AppendString activity
- AppendString appendString = new AppendString()
- {
- TheFirstStr = "Hello ",
- TheSecondStr = "custom activiy in WF4."
- };
-
- // Using WorkflowInvorker to invoke appendString activity
- // appendString is a generic-activity Activity<string>,
- // so Invoke method will return a string
- var outArgument = WorkflowInvoker.Invoke(appendString);
-
- Console.WriteLine("Result: {0}", outArgument);
- Console.WriteLine("Press Enter to exit ...");
- Console.ReadLine();
- }
Và kết quả thu được như sau
Chú ý: Đối với phương thức Invoke trong class WorkflowInvoker, nếu chúng ta invoke 1 activity được thừa kế từ Activity<TResult> thì kết quả trả về từ phương thức WorkflowInvoker.Invoke sẽ có cùng kiểu dữ liệu là TResult mà chúng ta thừa kế từ Activity<TResult>.
Chú ý: Như trong những bài viết trước đã nhắc đến, để có thể lấy được giá trị hay dữ liệu của các Arguments, chúng ta phải thông qua phương thức Get và Workflow context. Tuy nhiên, với việc sử dụng lamda expression thì công việc này trở nên rất đơn giản. Cụ thể trong ví dụ trên, để có thể lấy ra dữ liệu của TheFirstStr chúng ta sử dụng expression là context => TheFirstStr.Get(context).
Kế thừa từ CodeActivity<TResult>
Để xây dựng một custom activity, ngoài cách kế thừa từ lớp Activity<TResult>, chúng ta còn có thể kế thừa từ lớp CodeActivity<TResult>. Mặc dù, kết quả thu được giống nhau nhưng vẫn tồn tại sự khác biệt giữa 2 cách thực hiện này.
Vì CodeActivity<TResult> là một abstract class, do đó khi thừa kế từ class này, chúng ta phải implement cho các abstract member từ class CodeActivity<TResult>. Cụ thể nhất là để custom activity có thể thực thi được, chúng ta phải implement method Excute()
Code Snippet
- public sealed class AnotherAppendString : CodeActivity<string>
- {
- protected override string Execute(CodeActivityContext context)
- {
- throw new System.NotImplementedException();
- }
- }
Một điểm khác biệt nữa là nếu như kế thừa từ Activity<TResult> chúng ta phải khai báo Func cho property Implementation thì đối với cách thực này, chúng ta sẽ định nghĩa logic code của activity trong thân method Excute như sau:
Code Snippet
- public sealed class AnotherAppendString : CodeActivity<string>
- {
- [RequiredArgument]
- public InArgument<string> TheFirstStr { get; set; }
-
- [RequiredArgument]
- public InArgument<string> TheSecondStr { get; set; }
-
- protected override string Execute(CodeActivityContext context)
- {
- return context.GetValue<string>(TheFirstStr)
- + context.GetValue<string>(TheSecondStr);
- }
- }
Và kết quả thu được sẽ giống với kết quả thu được khi thực hiện xây dựng custom activity bằng cách kế thừa từ Activity<TResult>.
Phần 2 >>>