Miklix

Tổng quan nhanh về Dynamics AX 2012 SysOperation Framework

Đã xuất bản: lúc 22:36:32 UTC 15 tháng 2, 2025
Cập nhật lần cuối: lúc 08:39:48 UTC 12 tháng 1, 2026

Bài viết này cung cấp tổng quan nhanh (hoặc hướng dẫn tóm tắt) về cách triển khai các lớp xử lý và các tác vụ theo lô trong khung SysOperation của Dynamics AX 2012 và Dynamics 365 for Operations.


Trang này được dịch máy từ tiếng Anh để có thể tiếp cận được với nhiều người nhất có thể. Thật không may, dịch máy vẫn chưa phải là công nghệ hoàn thiện, do đó có thể xảy ra lỗi. Nếu bạn thích, bạn có thể xem phiên bản tiếng Anh gốc tại đây:

Dynamics AX 2012 SysOperation Framework Quick Overview

Thông tin trong bài viết này dựa trên Dynamics AX 2012 R3. Thông tin này có thể không đúng với các phiên bản khác. (Cập nhật: Tôi xác nhận rằng thông tin trong bài viết này cũng đúng với Dynamics 365 for Operations)


Bài viết này chỉ nhằm mục đích cung cấp cái nhìn tổng quan nhanh và tóm tắt những điểm chính. Nếu bạn mới làm quen với framework SysOperation, tôi khuyên bạn nên đọc thêm tài liệu chuyên sâu của Microsoft về chủ đề này. Thông tin ở đây có thể hữu ích nếu bạn chỉ cần ôn lại nhanh các lớp khác nhau liên quan đến việc phát triển các thao tác với framework này.

Có nhiều biến thể, nhưng khi sử dụng framework này, tôi thường triển khai ba lớp:

  • Hợp đồng dữ liệu (nên kế thừa từ SysOperationDataContractBase)
  • Dịch vụ (nên kế thừa từ SysOperationServiceBase)
  • Bộ điều khiển (phải kế thừa từ SysOperationServiceController)

Ngoài ra, tôi cũng có thể triển khai một lớp UIBuilder (phải kế thừa từ SysOperationUIBuilder), nhưng điều đó chỉ cần thiết nếu vì lý do nào đó hộp thoại cần phức tạp hơn so với những gì framework tự động tạo ra.


Hợp đồng dữ liệu

Hợp đồng dữ liệu chứa các thành viên dữ liệu cần thiết cho hoạt động của bạn. Nó có thể được so sánh với macro CurrentList điển hình được định nghĩa trong khung RunBase, nhưng được triển khai dưới dạng một lớp. Hợp đồng dữ liệu nên kế thừa từ SysOperationDataContractBase, nhưng vẫn hoạt động ngay cả khi không. Ưu điểm của việc kế thừa lớp cha là nó cung cấp một số thông tin phiên có thể hữu ích.

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

Trong ví dụ này, itemId là một thành viên dữ liệu. Bạn cần triển khai một phương thức parm cho mỗi thành viên dữ liệu và gắn thẻ nó bằng DataMemberAttribute để framework biết đó là gì. Điều này cho phép framework tự động xây dựng hộp thoại cho bạn.

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

    itemId = _itemId;
    return itemId;
}


Dịch vụ

Lớp dịch vụ là lớp chứa logic nghiệp vụ thực tế. Nó không liên quan đến việc hiển thị hộp thoại, xử lý hàng loạt hay bất cứ điều gì tương tự – đó là trách nhiệm của lớp điều khiển. Bằng cách tách biệt điều này, bạn sẽ dễ dàng thiết kế mã hơn và tạo ra mã có thể tái sử dụng hơn.

Giống như lớp hợp đồng dữ liệu, lớp dịch vụ không cần kế thừa từ bất kỳ lớp cụ thể nào, nhưng nó nên kế thừa từ lớp SysOperationServiceBase, ít nhất là nếu bạn dự kiến dịch vụ sẽ được chạy dưới dạng tác vụ xử lý hàng loạt, vì lớp cha cung cấp một số thông tin về ngữ cảnh xử lý hàng loạt. Phương thức bắt đầu hoạt động (tức là chạy logic nghiệp vụ) phải nhận một đối tượng của lớp hợp đồng dữ liệu của bạn làm đầu vào và nên được trang trí bằng [SysEntryPointAttribute]. Ví dụ:

class MyService extends SysOperationServiceBase
{
}

Với một phương thức có tên là run:

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


Bộ điều khiển

Lớp điều khiển xử lý việc thực thi và xử lý hàng loạt thao tác của bạn. Nó cũng đảm bảo rằng mã được thực thi trong CIL để đạt hiệu suất tối đa. Lớp điều khiển thường kế thừa từ lớp SysOperationServiceController, mặc dù cũng có các tùy chọn khác.

class MyController extends SysOperationServiceController
{
}

Phương thức khởi tạo của lớp cha nhận tên lớp, tên phương thức và (tùy chọn) chế độ thực thi làm tham số. Tên lớp và tên phương thức phải là tên của lớp dịch vụ của bạn và phương thức cần được chạy trên lớp đó. Vì vậy, bạn có thể triển khai phương thức khởi tạo của bộ điều khiển như sau:

public static MyController construct()
{
    ;

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

Khi đó, phương thức chính của lớp MyController có thể đơn giản như sau:

public static void main(Args _args)
{
    ;

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

Và về cơ bản là bạn đã hoàn thành. Ví dụ trên rõ ràng là rất đơn giản và khung phần mềm này chứa vô số các tùy chọn và khả năng khác, nhưng đây là một cái nhìn tổng quan nhanh chóng nếu bạn cần ôn lại kiến thức sau một thời gian dài không sử dụng khung phần mềm này.

Đọc thêm

Nếu bạn thích bài viết này, bạn cũng có thể thích những gợi ý sau:


Chia sẻ trên BlueskyChia sẻ trên FacebookChia sẻ trên LinkedInChia sẻ trên TumblrChia sẻ trên XChia sẻ trên LinkedInGhim trên Pinterest

Mikkel Christensen

Về tác giả

Mikkel Christensen
Mikkel là người sáng lập và chủ sở hữu của miklix.com. Ông có hơn 20 năm kinh nghiệm làm lập trình viên máy tính/nhà phát triển phần mềm chuyên nghiệp và hiện đang làm việc toàn thời gian cho một tập đoàn CNTT lớn của Châu Âu. Khi không viết blog, ông dành thời gian rảnh rỗi cho nhiều sở thích, thú vui và hoạt động, có thể được phản ánh ở một mức độ nào đó trong nhiều chủ đề được đề cập trên trang web này.