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

Bài viết này cung cấp tổng quan nhanh (hoặc hướng dẫn) về cách triển khai các lớp xử lý và tác vụ hàng loạt trong khuôn khổ SysOperation trong 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 đăng này dựa trên Dynamics AX 2012 R3. Thông tin có thể hoặc không thể áp dụng cho các phiên bản khác. (Cập nhật: Tôi có thể xác nhận rằng thông tin trong bài viết này cũng áp dụng cho Dynamics 365 for Operations)


Bài đăng này chỉ có ý nghĩa là tổng quan nhanh và hướng dẫn. Nếu bạn mới làm quen với SysOperation framework, tôi thực sự khuyên bạn nên đọc sách trắng 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 hoạt động với framework này.

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

  • Hợp đồng dữ liệu (nên mở rộng SysOperationDataContractBase)
  • Dịch vụ (nên mở rộng SysOperationServiceBase)
  • Bộ điều khiển ( phải mở rộng SysOperationServiceController)

Ngoài ra, tôi cũng có thể triển khai lớp UIBuilder ( phải mở rộng SysOperationUIBuilder), nhưng điều đó chỉ cần thiết nếu vì lý do nào đó, hộp thoại phải nâng cao hơn những gì mà khuôn khổ tự động tạo ra.


Hợp đồng dữ liệu

Hợp đồng dữ liệu giữ 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 thông thường được định nghĩa trong khuôn khổ RunBase, nhưng được triển khai dưới dạng một lớp thay thế. Hợp đồng dữ liệu sẽ mở rộng SysOperationDataContractBase, nhưng sẽ hoạt động ngay cả khi không mở rộng. Ưu điểm của việc mở rộng siêu lớp 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 phương thức parm cho mỗi thành viên dữ liệu và gắn thẻ nó với DataMemberAttribute để khung biết nó là gì. Điều này cho phép khung 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 hoặc bất kỳ thứ 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 có nhiều khả năng thiết kế mã của mình tốt hơn và tạo ra mã có thể tái sử dụng nhiều hơn.

Giống như lớp hợp đồng dữ liệu, lớp dịch vụ không cần phải kế thừa từ bất kỳ thứ gì cụ thể, nhưng nó phải kế thừa từ lớp SysOperationServiceBase, ít nhất là nếu bạn mong đợi rằng dịch vụ sẽ được chạy dưới dạng tác vụ hàng loạt, vì siêu lớp cung cấp một số thông tin về ngữ cảnh 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 lấy 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à phải được trang trí bằng [SysEntryPointAttribute]. Ví dụ:

class MyService extends SysOperationServiceBase
{
}

với phương pháp gọi 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 để có 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
{
}

Trình xây dựng của siêu lớp lấy 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 lớp dịch vụ của bạn và phương thức sẽ chạy trên lớp đó. Vì vậy, bạn có thể triển khai phương thức xây dựng của bộ điều khiển như sau:

public static MyController construct()
{
    ;

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

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

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 này chứa rất nhiều tùy chọn và khả năng khác, nhưng đây chỉ là bản tóm tắt nhanh nếu bạn cần ôn lại khi đã lâu không sử dụng khung này.

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 Bang Christensen

Về tác giả

Mikkel Bang 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.