ডায়নামিক্স এএক্স 2012 এ কোন সাবক্লাসটি তাত্ক্ষণিক করতে হবে তা খুঁজে বের করতে সিসএক্সটেনশন ফ্রেমওয়ার্ক ব্যবহার করে
প্রকাশিত: ১৬ ফেব্রুয়ারী, ২০২৫ এ ১২:২৬:১৭ AM UTC
সর্বশেষ আপডেট: ১২ জানুয়ারী, ২০২৬ এ ৮:৪৩:৩১ AM UTC
এই প্রবন্ধে বর্ণনা করা হয়েছে যে কীভাবে Dynamics AX 2012 এবং Dynamics 365-এ অপারেশনের জন্য স্বল্প-পরিচিত SysExtension ফ্রেমওয়ার্ক ব্যবহার করে অ্যাট্রিবিউট ডেকোরেশনের উপর ভিত্তি করে সাব-ক্লাস তৈরি করা যায়, যা একটি প্রসেসিং ক্লাস হায়ারার্কির সহজে এক্সটেনসিবল ডিজাইনের অনুমতি দেয়।
Using the SysExtension Framework to Find Out Which Subclass to Instantiate in Dynamics AX 2012
এই পোস্টের তথ্য Dynamics AX 2012 R3 এর উপর ভিত্তি করে তৈরি। এটি অন্যান্য সংস্করণের জন্য বৈধ হতে পারে আবার নাও হতে পারে। (আপডেট: আমি নিশ্চিত করতে পারি যে এই নিবন্ধের তথ্য Dynamics 365 এর অপারেশনের জন্যও বৈধ)
Dynamics AX-এ প্রসেসিং ক্লাস বাস্তবায়নের সময়, আপনাকে প্রায়শই এমন একটি ক্লাস হায়ারার্কি তৈরি করতে হয় যেখানে প্রতিটি সাবক্লাস একটি enum মানের সাথে মিলে যায় অথবা অন্য কোনও ডেটা কাপলিং থাকে। একটি ক্লাসিক ডিজাইন হল সুপার ক্লাসে একটি কনস্ট্রাক্ট মেথড থাকা, যার মধ্যে একটি সুইচ থাকে যা ইনপুটের উপর ভিত্তি করে কোন ক্লাসটি ইনস্ট্যান্টিয়েট করতে হবে তা নির্ধারণ করে।
নীতিগতভাবে এটি ভালো কাজ করে, কিন্তু যদি আপনার কাছে অনেকগুলি ভিন্ন সম্ভাব্য ইনপুট থাকে (একটি enum-এর অনেক উপাদান বা সম্ভবত ইনপুটটি বিভিন্ন মানের সংমিশ্রণ), তবে এটি বজায় রাখা ক্লান্তিকর এবং ত্রুটি-প্রবণ হয়ে উঠতে পারে এবং ডিজাইনের সর্বদা অসুবিধা থাকে যে আপনি যদি কখনও একটি নতুন সাবক্লাস যোগ করেন বা কোন ইনপুটের উপর ভিত্তি করে কোন সাবক্লাস ব্যবহার করা উচিত তাতে পরিবর্তন করেন তবে আপনাকে উক্ত নির্মাণ পদ্ধতিটি পরিবর্তন করতে হবে।
সৌভাগ্যবশত, এটি করার জন্য আরও অনেক মার্জিত, কিন্তু দুর্ভাগ্যবশত অনেক কম পরিচিত একটি উপায় আছে, যথা SysExtension ফ্রেমওয়ার্ক ব্যবহার করে।
এই ফ্রেমওয়ার্কটি এমন বৈশিষ্ট্যগুলির সুবিধা গ্রহণ করে যা আপনি আপনার সাব ক্লাসগুলিকে সাজাতে ব্যবহার করতে পারেন যাতে সিস্টেমটি কোন সাব ক্লাসটি কী পরিচালনা করার জন্য ব্যবহার করা উচিত তা নির্ধারণ করতে সক্ষম হয়। আপনার এখনও একটি নির্মাণ পদ্ধতির প্রয়োজন হবে, তবে যদি সঠিকভাবে করা হয়, তবে নতুন সাব ক্লাস যুক্ত করার সময় আপনাকে কখনই এটি পরিবর্তন করতে হবে না।
একটি কাল্পনিক উদাহরণ দেখি এবং ধরি যে আপনি একটি শ্রেণিবিন্যাস বাস্তবায়ন করতে যাচ্ছেন যা InventTrans টেবিলের উপর ভিত্তি করে কিছু ধরণের প্রক্রিয়াকরণ করে। কোন প্রক্রিয়াকরণটি করবেন তা রেকর্ডের StatusReceipt এবং StatusIssue এর উপর নির্ভর করে, সেইসাথে রেকর্ডগুলি SalesLine, PurchLine বা উভয়ের সাথে সম্পর্কিত কিনা তার উপরও নির্ভর করে। ইতিমধ্যেই, আপনি অনেকগুলি বিভিন্ন সমন্বয় দেখছেন।
তাহলে ধরা যাক যে আপনি জানেন যে আপাতত আপনাকে কেবল কয়েকটি সংমিশ্রণ পরিচালনা করতে হবে, তবে আপনি এটাও জানেন যে সময়ের সাথে সাথে আপনাকে আরও বেশি সংমিশ্রণ পরিচালনা করতে সক্ষম হতে বলা হবে।
তুলনামূলকভাবে সহজ করে বলি যে আপাতত আপনাকে কেবল SalesLine সম্পর্কিত রেকর্ডগুলি পরিচালনা করতে হবে যেখানে ReservPhysical বা ReservOrdered এর StatusIssue থাকবে, অন্যান্য সমস্ত সমন্বয় আপাতত উপেক্ষা করা যেতে পারে, কিন্তু যেহেতু আপনি জানেন যে আপনাকে পরে সেগুলি পরিচালনা করতে হবে, তাই আপনি আপনার কোডটি এমনভাবে ডিজাইন করতে চাইবেন যাতে এটি সহজেই এক্সটেনসিবল হয়।
আপনার শ্রেণিবিন্যাস আপাতত এরকম কিছু দেখতে পারে:
- আমারপ্রসেসরআমারপ্রসেসর_বিক্রয়আমারপ্রসেসর_বিক্রয়_সংরক্ষিতঅর্ডার করাআমারপ্রসেসর_বিক্রয়_সংরক্ষিতশারীরিক
এখন, আপনি সহজেই সুপার ক্লাসে এমন একটি পদ্ধতি প্রয়োগ করতে পারেন যা ModuleInventPurchSales এবং StatusIssue enum এর উপর ভিত্তি করে একটি সাবক্লাস তৈরি করে। কিন্তু তারপরে আপনাকে প্রতিবার সাবক্লাস যোগ করার সময় সুপার ক্লাসটি পরিবর্তন করতে হবে, এবং এটি আসলে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ে উত্তরাধিকারের ধারণা নয়। সর্বোপরি, প্রতিবার নতুন ব্যাচ জব যোগ করার সময় আপনাকে RunBaseBatch বা SysOperationServiceBase পরিবর্তন করতে হবে না।
পরিবর্তে, আপনি SysExtension ফ্রেমওয়ার্ক ব্যবহার করতে পারেন। এর জন্য আপনাকে আরেকটি ক্লাস যোগ করতে হবে, যার জন্য SysAttribute প্রসারিত করতে হবে। এই ক্লাসটি এমন একটি অ্যাট্রিবিউট হিসেবে ব্যবহার করা হবে যা দিয়ে আপনি আপনার প্রসেসিং ক্লাসগুলিকে সাজাতে পারবেন।
এই ক্লাসটি SysOperation বাস্তবায়নের জন্য ডেটা কন্ট্রাক্ট ক্লাস তৈরির সাথে অনেকটাই মিল, কারণ এতে কিছু ডেটা সদস্য এবং প্যার্ম পদ্ধতি থাকবে যা সেই মানগুলি পেতে এবং সেট করতে সাহায্য করবে।
আমাদের ক্ষেত্রে, ClassDeclaration দেখতে এরকম কিছু হতে পারে:
{
ModuleInventPurchSales module;
StatusIssue statusIssue;
StatusReceipt statusReceipt
}
সকল ডেটা সদস্যকে ইনস্ট্যান্টিয়েট করার জন্য আপনাকে একটি new() পদ্ধতি তৈরি করতে হবে। আপনি যদি চান তবে তাদের কিছু বা সকলকে ডিফল্ট মান দিতে পারেন, কিন্তু আমি তা করিনি।
StatusIssue _statusIssue,
StatusReceipt _statusReceipt)
{
;
super();
module = _module;
statusIssue = _statusIssue;
statusReceipt = _statusReceipt;
}
এবং আপনার প্রতিটি ডেটা সদস্যের জন্য একটি parm পদ্ধতিও প্রয়োগ করা উচিত, কিন্তু আমি এখানে সেগুলি বাদ দিয়েছি কারণ আমি নিশ্চিত যে আপনি এটি কীভাবে করতে হয় তা জানেন - অন্যথায়, আসুন এটি একটি অনুশীলন হিসাবে বিবেচনা করি ;-)
এখন তুমি তোমার প্রতিটি প্রসেসিং ক্লাস সাজাতে তোমার অ্যাট্রিবিউট ক্লাস ব্যবহার করতে পারো। উদাহরণস্বরূপ, ক্লাস ঘোষণাগুলো এরকম দেখতে পারে:
StatusIssue::None,
StatusReceipt::None)]
class MyProcessor_Sales extends MyProcessor
{
}
[MyProcessorSystemAttribute(ModuleInventPurchSales::Sales,
StatusIssue::ReservOrdered,
StatusReceipt::None)]
class MyProcessor_Sales_ReservOrdered extends MyProcessor_Sales
{
}
[MyProcessorSystemAttribute(ModuleInventPurchSales::Sales,
StatusIssue::ReservPhysical,
StatusReceipt::None)]
class MyProcessor_Sales_ReservPhysical extends MyProcessor_Sales
{
}
অবশ্যই তুমি তোমার ক্লাসের নামকরণ করতে পারো, এখানে গুরুত্বপূর্ণ অংশ হলো তুমি তোমার ক্লাসগুলিকে এমন বৈশিষ্ট্য দিয়ে সাজাতে হবে যা তারা যে ধরণের প্রক্রিয়াকরণ করে তার সাথে সঙ্গতিপূর্ণ। (কিন্তু মনে রাখবেন যে Dynamics AX-এ ক্লাস হায়ারার্কির জন্য নামকরণের নিয়ম রয়েছে এবং সম্ভব হলে সেগুলি অনুসরণ করা সর্বদা একটি ভাল ধারণা)।
এখন যেহেতু আপনি আপনার ক্লাসগুলি সাজিয়েছেন যাতে প্রতিটি ক্লাস কী ধরণের প্রক্রিয়াকরণ করে তা সনাক্ত করা যায়, আপনি প্রয়োজন অনুসারে সাব ক্লাসের অবজেক্টগুলিকে ইনস্ট্যান্টিয়েট করার জন্য SysExtension ফ্রেমওয়ার্কের সুবিধা নিতে পারেন।
আপনার সুপার ক্লাসে (মাইপ্রসেসর), আপনি এইরকম একটি কনস্ট্রাক্ট পদ্ধতি যোগ করতে পারেন:
StatusIssue _statusIssue,
StatusReceipt _statusReceipt)
{
MyProcessor ret;
MyProcessorSystemAttribute attribute;
;
attribute = new MyProcessorSystemAttribute( _module,
_statusIssue,
_statusReceipt);
ret = SysExtensionAppClassFactory::getClassFromSysAttribute(classStr(MyProcessor), attribute);
if (!ret)
{
// no class found
// here you could throw an error, instantiate a default
// processor instead, or just do nothing, up to you
}
return ret;
}
এই পুরো পোস্টের সবচেয়ে আকর্ষণীয় অংশ - এবং প্রকৃতপক্ষে অবজেক্ট (শ্লেষের জন্য ক্ষমা চাই) হল SysExtensionAppClassFactory ক্লাসের getClassFromSysAttribute() পদ্ধতি। এই পদ্ধতিটি যা করে তা হল এটি একটি অনুক্রমের সুপার ক্লাসের নাম গ্রহণ করে (এবং এই সুপার ক্লাসটি অনুক্রমের শীর্ষে থাকা প্রয়োজন হয় না; এর সহজ অর্থ হল যে শুধুমাত্র এই শ্রেণীকে প্রসারিত করা ক্লাসগুলিই যোগ্য হবে) এবং একটি অ্যাট্রিবিউট অবজেক্ট।
এরপর এটি একটি ক্লাসের অবজেক্ট রিটার্ন করে যা নির্দিষ্ট সুপার ক্লাসকে প্রসারিত করে এবং একটি সংশ্লিষ্ট অ্যাট্রিবিউট দিয়ে সজ্জিত।
আপনি স্পষ্টতই construct পদ্ধতিতে যত ইচ্ছা আরও বৈধতা বা যুক্তি যোগ করতে পারেন, তবে এখানে গুরুত্বপূর্ণ বিষয় হল যে একবার বাস্তবায়িত হয়ে গেলে, আপনাকে আর কখনও এই পদ্ধতিটি পরিবর্তন করতে হবে না। আপনি অনুক্রমের সাথে সাব ক্লাস যোগ করতে পারেন এবং যতক্ষণ আপনি সেগুলিকে যথাযথভাবে সাজানোর বিষয়টি নিশ্চিত করেন, construct পদ্ধতিটি সেগুলি খুঁজে পাবে যদিও এটি লেখার সময় সেগুলি বিদ্যমান ছিল না।
পারফরম্যান্স সম্পর্কে কী বলা যায়? সত্যি বলতে, আমি এটিকে বেঞ্চমার্ক করার চেষ্টা করিনি, তবে আমার মনে হয় এটি সম্ভবত ক্লাসিক সুইচ স্টেটমেন্ট ডিজাইনের চেয়েও খারাপ পারফর্ম করে। তবে, যেহেতু Dynamics AX-এর বেশিরভাগ পারফরম্যান্স সমস্যা ডাটাবেস অ্যাক্সেসের কারণে হয়, তাই আমি এটি নিয়ে খুব বেশি চিন্তা করব না।
অবশ্যই, যদি আপনি এমন কিছু বাস্তবায়ন করেন যার জন্য হাজার হাজার অবজেক্ট দ্রুত তৈরি করতে হবে, তাহলে আপনি আরও তদন্ত করতে চাইতে পারেন, কিন্তু যেসব ক্লাসিক ক্ষেত্রে আপনি কেবল একটি অবজেক্টকে কিছু দীর্ঘ প্রক্রিয়াকরণের জন্য ইনস্ট্যান্টিয়েট করেন, আমার সন্দেহ আছে যে এটি কোনও ব্যাপার হবে। এছাড়াও, আমার সমস্যা সমাধানের টিপ (পরবর্তী অনুচ্ছেদ) বিবেচনা করে, মনে হচ্ছে SysExtension ফ্রেমওয়ার্ক ক্যাশিংয়ের উপর নির্ভর করে, তাই একটি চলমান সিস্টেমে আমার সন্দেহ আছে যে এটির উল্লেখযোগ্য পারফরম্যান্স হিট আছে।
সমস্যা সমাধান: যদি কনস্ট্রাক্ট পদ্ধতি আপনার সাব ক্লাসগুলি সঠিকভাবে সাজানো হয়েছে কিনা তা নিশ্চিত হওয়া সত্ত্বেও খুঁজে না পায়, তাহলে এটি একটি ক্যাশিং সমস্যা হতে পারে। ক্লায়েন্ট এবং সার্ভার উভয়ের ক্যাশ সাফ করার চেষ্টা করুন। AOS পুনরায় চালু করার প্রয়োজন হবে না, তবে এটি শেষ অবলম্বন হতে পারে।
আরও পড়ুন
যদি আপনি এই পোস্টটি উপভোগ করেন, তাহলে আপনার এই পরামর্শগুলিও পছন্দ হতে পারে:
- ডায়নামিক্স এএক্স 2012 এ ডেটা () এবং বিইউএফ 2 বুফ () এর মধ্যে পার্থক্য
- ডায়নামিক্স এএক্স 2012 এ সরাসরি এক্স ++ থেকে এআইএফ ডকুমেন্ট পরিষেবাদিতে কল করা
- ডায়নামিক্স এএক্স 2012 এ এআইএফ পরিষেবার জন্য ডকুমেন্ট ক্লাস এবং ক্যোয়ারী সনাক্তকরণ
