Miklix

بررسی سریع Dynamics AX 2012 SysOperation Framework

منتشر شده: ۱۵ فوریهٔ ۲۰۲۵ ساعت ۲۲:۳۶:۳۴ (UTC)
آخرین به روز رسانی: ۱۲ ژانویهٔ ۲۰۲۶ ساعت ۸:۳۹:۴۹ (UTC)

این مقاله یک مرور سریع (یا راهنمای جامع) در مورد نحوه پیاده‌سازی کلاس‌های پردازش و کارهای دسته‌ای در چارچوب SysOperation در Dynamics AX 2012 و Dynamics 365 for Operations ارائه می‌دهد.


این صفحه ماشینی از انگلیسی ترجمه شد تا در دسترس هر چه بیشتر مردم باشد. متأسفانه، ترجمه ماشینی هنوز یک فناوری کامل نشده است، بنابراین ممکن است خطاهایی رخ دهد. در صورت تمایل می توانید نسخه اصلی انگلیسی را در اینجا مشاهده کنید:

Dynamics AX 2012 SysOperation Framework Quick Overview

اطلاعات موجود در این پست بر اساس Dynamics AX 2012 R3 است. ممکن است برای نسخه‌های دیگر معتبر باشد یا نباشد. (به‌روزرسانی: می‌توانم تأیید کنم که اطلاعات موجود در این مقاله برای Dynamics 365 for Operations نیز معتبر است)


این پست فقط به عنوان یک مرور سریع و یک راهنمای مقدماتی در نظر گرفته شده است. اگر در چارچوب SysOperation تازه‌کار هستید، اکیداً پیشنهاد می‌کنم که مقاله رسمی مایکروسافت در این مورد را نیز مطالعه کنید. اطلاعات اینجا ممکن است مفید باشد اگر فقط به یک مرور سریع در مورد کلاس‌های مختلف درگیر در توسعه عملیات با این چارچوب نیاز دارید.

انواع مختلفی وجود دارد، اما وقتی از این چارچوب استفاده می‌کنم، معمولاً سه کلاس را پیاده‌سازی می‌کنم:

  • قرارداد داده (باید SysOperationDataContractBase را گسترش دهد)
  • سرویس (باید SysOperationServiceBase را گسترش دهد)
  • کنترلر (باید SysOperationServiceController را ارث‌بری کند)

علاوه بر این، ممکن است یک کلاس UIBuilder نیز پیاده‌سازی کنم (باید SysOperationUIBuilder را ارث‌بری کند)، اما این فقط در صورتی ضروری است که به دلایلی لازم باشد دیالوگ از آنچه فریم‌ورک به طور خودکار تولید می‌کند، پیشرفته‌تر باشد.


قرارداد داده

قرارداد داده، اعضای داده مورد نیاز برای عملیات شما را در خود جای می‌دهد. می‌توان آن را با ماکروی معمولی CurrentList که در چارچوب RunBase تعریف شده است، مقایسه کرد، اما به جای آن به عنوان یک کلاس پیاده‌سازی شده است. قرارداد داده باید SysOperationDataContractBase را گسترش دهد، اما حتی اگر این کار را نکند، کار خواهد کرد. مزیت گسترش کلاس اصلی این است که برخی اطلاعات جلسه را ارائه می‌دهد که ممکن است مفید باشد.

[DataContractAttribute]
class MyDataContract extends SysOperationDataContractBase
{
    ItemId itemId;
}

در این مثال، itemId یک عضو داده است. شما باید برای هر عضو داده یک متد parm پیاده‌سازی کنید و آن را با DataMemberAttribute برچسب‌گذاری کنید تا چارچوب بداند که چیست. این کار چارچوب را قادر می‌سازد تا به طور خودکار کادر محاوره‌ای را برای شما بسازد.

[DataMemberAttribute]
public ItemId parmItemId(ItemId _itemId = itemId)
{
    ;

    itemId = _itemId;
    return itemId;
}


خدمات

کلاس سرویس، کلاسی است که منطق تجاری واقعی را در بر می‌گیرد. این کلاس ربطی به نمایش دیالوگ‌ها، پردازش دسته‌ای یا هر چیز دیگری از این قبیل ندارد - این مسئولیت کلاس کنترلر است. با جدا کردن این بخش، احتمال بیشتری وجود دارد که کد خود را به خوبی طراحی کنید و کدی با قابلیت استفاده مجدد بیشتر ایجاد کنید.

مانند کلاس data contract، کلاس سرویس نیازی به ارث‌بری از چیز خاصی ندارد، اما باید از کلاس SysOperationServiceBase ارث‌بری کند، حداقل اگر انتظار دارید که سرویس به عنوان یک کار دسته‌ای اجرا شود، زیرا کلاس اصلی اطلاعاتی در مورد زمینه دسته‌ای ارائه می‌دهد. متدی که عملیات را شروع می‌کند (یعنی منطق کسب و کار را اجرا می‌کند) باید یک شیء از کلاس data contract شما را به عنوان ورودی دریافت کند و باید با [SysEntryPointAttribute] تزئین شود. به عنوان مثال:

class MyService extends SysOperationServiceBase
{
}

با متدی به نام run:

[SysEntryPointAttribute]
public void run(MyDataContract _dataContract)
{
    // run business logic here
}


کنترل کننده

کلاس کنترلر، اجرا و پردازش دسته‌ای عملیات شما را مدیریت می‌کند. همچنین تضمین می‌کند که کد برای حداکثر کارایی در CIL اجرا شود. کلاس کنترلر معمولاً از کلاس SysOperationServiceController ارث‌بری می‌کند، اگرچه گزینه‌های دیگری نیز وجود دارد.

class MyController extends SysOperationServiceController
{
}

سازنده‌ی کلاس اصلی، نام کلاس، نام متد و (اختیاری) حالت اجرا را به عنوان پارامتر دریافت می‌کند. نام کلاس و متد باید نام کلاس سرویس شما و متدی باشد که باید روی آن اجرا شود. بنابراین، می‌توانید متد construct کنترلر خود را به این صورت پیاده‌سازی کنید:

public static MyController construct()
{
    ;

    return new MyController(classStr(MyService),
    methodStr(MyService, run));
}

سپس متد اصلی کلاس MyController می‌تواند به سادگی زیر باشد:

public static void main(Args _args)
{
    ;

    MyController::construct().startOperation();
}

و اساساً کار شما تمام است. مثال بالا بدیهی است که یک مثال بسیار ساده است و این چارچوب شامل مجموعه‌ای از گزینه‌ها و امکانات دیگر است، اما اگر مدتی از این چارچوب استفاده نکرده‌اید و نیاز به مرور کلی دارید، این به عنوان یک مرور سریع عمل می‌کند.

مطالعه بیشتر

اگر از این پست لذت بردید، ممکن است این پیشنهادات را نیز بپسندید:


در Bluesky به اشتراک بگذاریددر فیسبوک به اشتراک بگذاریددر لینکدین به اشتراک بگذاریددر Tumblr به اشتراک بگذاریددر X به اشتراک بگذاریددر لینکدین به اشتراک بگذاریدپین در پینترست

میکل کریستنسن

درباره نویسنده

میکل کریستنسن
مایکل خالق و صاحب miklix.com است. او بیش از 20 سال تجربه به عنوان یک برنامه نویس حرفه ای کامپیوتر / توسعه دهنده نرم افزار دارد و در حال حاضر به طور تمام وقت برای یک شرکت بزرگ فناوری اطلاعات اروپایی مشغول به کار است. هنگامی که وبلاگ نویسی نمی کند، اوقات فراغت خود را صرف مجموعه وسیعی از علایق، سرگرمی ها و فعالیت ها می کند، که ممکن است تا حدی در موضوعات مختلف پوشش داده شده در این وب سایت منعکس شود.