与CLR/BCL/C#里的概念进行联想对比,不难理解。

using System;
using System.Activities;
using System.Activities.Expressions;
using System.Activities.Statements;

namespace ActivityDelegateAndInvoke
{
    public sealed class GetAndPlay<T> : Activity
    {
        public ActivityFunc<T> Get { get; set; }
        public ActivityAction<T> Play { get; set; }
        public GetAndPlay()
        {
            this.Implementation = () =>
                {
                    Variable<T> data = new Variable<T>();
                    var seq = new Sequence
                    {
                        Variables = { data },
                        Activities =
                        {
                            new InvokeFunc<T>
                            {
                                Func = Get,
                                Result = data
                            },
                            new InvokeAction<T>
                            {
                                Action = Play,
                                Argument = data
                            }
                        }
                    };
                    return seq;
                };
        }
        protected override void CacheMetadata(ActivityMetadata metadata)
        {
            base.CacheMetadata(metadata);
            if (Get == null)
                metadata.AddValidationError("Get is null");
            if (Play == null)
                metadata.AddValidationError("Play is null");
        }
    }
    public sealed class GetDateTime : CodeActivity<string>
    {
        protected override string Execute(CodeActivityContext context)
        {
            return DateTime.Now.ToString();
        }
    }
    public sealed class Show : CodeActivity
    {
        [RequiredArgument]
        public InArgument<string> Text { get; set; }
        protected override void Execute(CodeActivityContext context)
        {
            Console.WriteLine(this.Text.Get(context));
        }
    }
    public static class Test
    {
        public static void Run()
        {
            var dateOut = new DelegateOutArgument<string>();
            var getDateTime = new ActivityFunc<string>
            {
                Result = dateOut,
                Handler = new GetDateTime
                {
                    Result = dateOut
                }
            };
            var dateIn = new DelegateInArgument<string>();
            var show = new ActivityAction<string>
            {
                Argument = dateIn,
                Handler = new Show
                {
                    Text = dateIn
                }
            };
            var showDatetime = new GetAndPlay<string>
            {
                Get = getDateTime,
                Play = show
            };
            WorkflowInvoker.Invoke(showDatetime);
        }
    }
}
posted on 2011-04-18 18:16  zzfff  阅读(479)  评论(0编辑  收藏  举报