ساخت اکتیویتی با Bookmark
ساخت اکتیویتی با Bookmark
با استفاده از InArgument و OutArgument و InOutArgument می توانیم داده های دلخواهمان را زمانی که Workflow شروع یا Start می شود به آن پاس دهیم و یا زمانی که پایان یافت از آن دریافت کنیم.
اما چگونه می توان داده ها را به Workflow ای که در حال اجراست پاس داد؟
برای انجام این کار Bookmark ها به ما کمک خواهند کرد. در این قسمت از آموزش Workflow قصد داریم با استفاده از Bookmark یک اکتیویتی بنام MyReadLine ایجاد نماییم.
مراحل انجام کار
پروژه گردش کار UseBookmark شامل 6 مرحله زیر است:
- اضافه کردن یک پروژه از نوع Workflow Console Application
- ساخت اکتیویتی با استفاده از Bookmark
- طراحی گردش کار
- نوشتن کدهای #C برای اجرای Workflow
- اجرای Workflow
- پروژه گردش کار UseBookmark چگونه کار می کند؟
1 اضافه کردن یک پروژه جدید از نوع Workflow Console Application
در پنل Solution Explorer مطابق شکل زیر روی Solution Chapter01 راست کلیک کرده و از گزینه ADD زیر منوی New Project را انتخاب نمایید:
در پنجره Add New Project گزینه workflow را انتخاب کرده و سپس از سمت راست پنجره گزینه Workflow Console Application را انتخاب نمایید. حالا قسمت Name را با مقدار UseBookmark تنظیم نمایید و نهایتاً روی دکمه OK کلیک کنید.
در پنل Solution Explorer مطابق شکل زیر روی پروژه UseBookmark راست کلیک کرده و از گزینه ADD زیر منوی New Item را انتخاب نمایید:
در پنجره باز شده یعنی Add New Item مطابق زیر Code File را انتخاب کنید و قسمت Name را با MyReadLineActivity تنظیم نمایید:
2 ساخت اکتیویتی با استفاده از Bookmark
اما در ادامه فایل MyReadLineActivity.cs را باز کنید و کدهای زیر را به آن اضافه نمایید:
فایل MyReadLineActivity.cs
using System.Activities; namespace UseBookmark { public class MyReadLine : NativeActivity { [RequiredArgument] public InArgument BookmarkName { get; set; } protected override void Execute(NativeActivityContext context) { context.CreateBookmark(BookmarkName.Get(context), new BookmarkCallback(OnResumeBookmark)); } protected override bool CanInduceIdle { get { { return true; } } } public void OnResumeBookmark(NativeActivityContext context,Bookmark bookmark,object obj) { Result.Set(context, (string)obj); } } }
فایل را ذخیره کنید و با استفاده از دکمه F6 پروژه را Build کنید. حالا اگر فایل Workflow1.xaml را باز کنید و به پنل Toolbox توجه کنید، مشاهده خواهید کرد که اکتیویتی MyReadLine به آن اضافه شده است.
3 طراحی گردش کار
از پنل Solution Explorerr فایل Workflow1.xaml را باز کنید و Workflow را مطابق زیر طراحی نمایید:
- از پنل ToolBox، اکتیویتی Sequence را انتخاب کرده و به داخل صفحه طراحی گردش کار بکشید.
- روی اکتیویتی Sequence کلیک کنید و سپس از پایین صفحه، تب Variables را انتخاب نمایید. حالا یک متغییر از نوع Int32 بنام GreetingMessage ایجاد نمایید.
- حالا از پایین صفحه، تب Arguments را انتخاب نمایید و مطابق شکل زیر آرگومان BookmarkNameInarg را تعریف نمایید.
- از پنل Toolbox اکتیویتی WriteLine را به داخل Sequence بکشید و فیلد Text آنرا مقدار دهی نمایید.
- حالا نوبت به استفاده از اکتیویتی سفارشی خودمان است. مطابق شکل زیر اکتیویتی MyReadLine را داخل Sequence قرار دهید و روی آن راست کلیک کرده و Properties را انتخاب نمایید. در ادامه فیلدهای نشان داده را مطابق شکل تنظیم نمایید.
- یکبار دیگر از پنل Toolbox اکتیویتی WriteLine را به داخل Sequence بکشید و فیلد Text آنرا مقدار دهی نمایید.
4 نوشتن کدهای #C برای اجرای Workflow
اما در ادامه فایل Program.cs را باز کنید و مطابق زیر کدها را تغییر دهید (قسمت قرمز رنگ):
فایل Program.cs
using System; using System.Linq; using System.Activities; using System.Activities.Statements; using System.Threading; namespace UseBookmark { class Program { static void Main(string[] args) { AutoResetEvent syncEvent =new AutoResetEvent(false); string bookmarkName = "GreetingBookmark"; WorkflowApplication wfApp = new WorkflowApplication(new Workflow1() { BookmarkNameInarg = bookmarkName }); wfApp.Completed = delegate(WorkflowApplicationCompletedEventArgs e) { syncEvent.Set(); }; wfApp.Run(); wfApp.ResumeBookmark(bookmarkName,Console.ReadLine()); syncEvent.WaitOne(); Console.WriteLine("-------------\nProvided to you by : http://www.beyamooz.com \npress any key ..."); Console.ReadLine(); } } }
5 اجرای Workflow
پروژه UseBookmark را بعنوان پروژه StartUp تنظیم نمایید و در ادامه برای اجرای Workflow دکمه های میانبر Ctrl+F5 را فشار دهید. با این کار Workflow ذخیره شده و بدون عملیات debugging نتیجه نشان داده خواهد شد. همان طور که می بینید، نتیجه در Console ویندوز اجرا می شود و اعدادی که انتظارش را داشتیم چاپ می شود:
6 پروژه گردش کار UseBookmark چگونه کار می کند؟
در مرحله 2 (ساخت اکتیویتی با استفاده از Bookmark)، کلاسی را ایجاد کردیم که از NativeActivity ارثبری دارد. NativeActivity یک اکتیویتی abstract ویژه است که با استفاده از آن می توانید اکتیویتی های پیچیده بسازید.
درباره نحوه ی ساخت اکتیویتی های پیجیده در فصل 5 بیشتر صحبت خواهد شد.
اما در کد زیر، با استفاده از متد ()context.CreateBookmark یک Bookmark با دو آرگومان BookMarkName و BookMarkCallback ایجاد کرده ایم:
فایل MyReadLineActivity.cs
context.CreateBookmark(BookmarkName.Get(context),new BookmarkCallback(OnResumeBookmark));
زمانی که در فایل Program.cs تابع ()wfApp.ResumeBookmark را فراخوانی می کنیم، متد OnResumeBookmark ای که در فایل MyReadLineActivity.cs تعریف کردیم، اجرا خواهد شد.
اما در کد زیر، با تنظیم خصوصیت CanInduceIdle نشان می دهیم که آیا اکتیویتی سفارشی ما می تواند باعث شود که Workflow متوقف (Idle) شود یا خیر؟ مقدار پیشفرض false است:
فایل MyReadLineActivity.cs
protected override bool CanInduceIdle { get { { return true; } } }
اما قطعه کد زیر را در نظر بگیرید:
فایل Program.cs
wfApp.ResumeBookmark(bookmarkName,Console.ReadLine());
زمانی که دستور بالا اجرا می شود، متد ()OnResumeBookmark در اکتیویتی MyReadLine فراخوانی خواهد شد و مقدار که در کنسول توسط کاربر وارد شده است توسط متد ()Console.ReadLine دریافت شده و به ()OnResumeBookmark پاس داده می شود.
{module خرید و دانلود فصل اول آموزش Workflow}
- نوشته شده توسط امیر پهلوان صادق
- بازدید: 8134
دیدگاهها
با سلام دوره پیشرفته آموزش گردش کار ایا آماده می شود؟
سلام. ببخشید! متغیر Result در تابع OnResumeBookmar k در کلاس MyReadLine جایی تعریف نشده و خطا می ده. چی باید باشه Result؟
سلام، پیشنهاد می کنم پروژه های ارائه شده در این فصل را خریداری فرمایید:
beyamooz.com/product/workflow/%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%87%D8%A7%DB%8C-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA%DB%8C-workflow