ডায়নামিক্স এএক্স 2012 এ কোন সাবক্লাসটি তাত্ক্ষণিক করতে হবে তা খুঁজে বের করতে সিসএক্সটেনশন ফ্রেমওয়ার্ক ব্যবহার করে
প্রকাশিত: ১৬ ফেব্রুয়ারী, ২০২৫ এ ১২:২৬:১৭ AM UTC
এই নিবন্ধটি ডায়নামিক্স এএক্স 2012 এবং ডায়নামিক্স 365 এ স্বল্প-পরিচিত সিসএক্সটেনশন ফ্রেমওয়ার্কটি কীভাবে ব্যবহার করা যায় তা বর্ণনা করে বৈশিষ্ট্য সজ্জার উপর ভিত্তি করে সাব ক্লাসগুলি তাত্ক্ষণিক করতে, একটি প্রসেসিং ক্লাস শ্রেণিবিন্যাসের সহজেই এক্সটেনসিবল ডিজাইনের অনুমতি দেয়।
Using the SysExtension Framework to Find Out Which Subclass to Instantiate in Dynamics AX 2012
এই পোস্টের তথ্য Dynamics AX 2012 R3 এর উপর ভিত্তি করে। এটি অন্যান্য সংস্করণের জন্য বৈধ হতে পারে বা নাও হতে পারে। (আপডেট: আমি নিশ্চিত করতে পারি যে এই নিবন্ধের তথ্যটি অপারেশনগুলির জন্য ডায়নামিক্স 365 এর জন্যও বৈধ)
ডায়নামিক্স এএক্সে প্রসেসিং ক্লাসগুলি প্রয়োগ করার সময়, আপনি প্রায়শই একটি শ্রেণির শ্রেণিবিন্যাস তৈরির মুখোমুখি হন যেখানে প্রতিটি সাবক্লাস একটি এনাম মানের সাথে মিলে যায় বা অন্য কোনও ডেটা কাপলিং থাকে। একটি ক্লাসিক ডিজাইন তখন সুপার ক্লাসে একটি নির্মাণ পদ্ধতি থাকতে হয়, যার একটি সুইচ থাকে যা ইনপুটটির উপর ভিত্তি করে কোন ক্লাসটি তাত্ক্ষণিক হবে তা নির্ধারণ করে।
এটি নীতিগতভাবে ভাল কাজ করে, তবে আপনার যদি বিভিন্ন সম্ভাব্য ইনপুট থাকে (একটি এনামের অনেকগুলি উপাদান বা সম্ভবত ইনপুটটি বিভিন্ন বিভিন্ন মানের সংমিশ্রণ), এটি বজায় রাখা ক্লান্তিকর এবং ত্রুটি-প্রবণ হয়ে উঠতে পারে এবং ডিজাইনের সর্বদা অসুবিধা থাকে যে আপনি যদি কখনও একটি নতুন সাবক্লাস যুক্ত করেন বা কোন ইনপুটটির উপর ভিত্তি করে কোন সাবক্লাস ব্যবহার করা উচিত তা পরিবর্তন করতে হবে তবে আপনাকে সংশোধন করতে হবে।
ভাগ্যক্রমে, আরও অনেক মার্জিত, তবে দুর্ভাগ্যক্রমে এটি করার উপায়ও অনেক কম পরিচিত, যথা সিসএক্সটেনশন ফ্রেমওয়ার্ক ব্যবহার করে।
এই ফ্রেমওয়ার্কটি এমন বৈশিষ্ট্যগুলির সুবিধা নেয় যা আপনি আপনার সাব ক্লাসগুলি সাজানোর জন্য ব্যবহার করতে পারেন যাতে সিস্টেমটি কী পরিচালনা করার জন্য কোন সাব ক্লাসটি ব্যবহার করা উচিত তা নির্ধারণ করতে সক্ষম হয়। আপনার এখনও একটি নির্মাণ পদ্ধতির প্রয়োজন হবে, তবে সঠিকভাবে করা হলে নতুন সাব ক্লাস যুক্ত করার সময় আপনাকে কখনই এটি সংশোধন করতে হবে না।
আসুন একটি কাল্পনিক উদাহরণ দেখি এবং বলি যে আপনি এমন একটি শ্রেণিবিন্যাস বাস্তবায়ন করতে যাচ্ছেন যা ইনভেন্টট্রান্স টেবিলের উপর ভিত্তি করে কিছু ধরণের প্রক্রিয়াকরণ করে। কোন প্রক্রিয়াকরণটি করা হবে তা রেকর্ডগুলির স্ট্যাটাসরিসিপ এবং স্ট্যাটাসইস্যুর উপর নির্ভর করে, পাশাপাশি রেকর্ডগুলি সেলসলাইন, পার্চলাইনের সাথে সম্পর্কিত কিনা তার উপরও নির্ভর করে। ইতিমধ্যেই আপনি অনেকগুলি বিভিন্ন সংমিশ্রণের দিকে তাকিয়ে আছেন।
আসুন তারপরে বলি যে আপনি জানেন যে আপাতত আপনাকে কেবল কয়েকটি মুষ্টিমেয় সংমিশ্রণ পরিচালনা করতে হবে, তবে আপনি এও জানেন যে আপনাকে সময়ের সাথে সাথে আরও বেশি সংমিশ্রণ পরিচালনা করতে সক্ষম হতে বলা হবে।
আসুন এটি তুলনামূলকভাবে সহজ রাখুন এবং বলুন যে আপাতত আপনাকে কেবল রিজার্ভফিজিক্যাল বা রিজার্ভঅর্ডারের স্ট্যাটাসইস্যু সহ সেলসলাইন সম্পর্কিত রেকর্ডগুলি পরিচালনা করতে হবে, অন্য সমস্ত সংমিশ্রণগুলি আপাতত উপেক্ষা করা যেতে পারে, তবে যেহেতু আপনি জানেন যে আপনাকে পরে সেগুলি পরিচালনা করতে হবে, আপনি আপনার কোডটি এমনভাবে ডিজাইন করতে চাইবেন যা এটি সহজেই এক্সটেনসিবল করে তোলে।
আপনার শ্রেণিবিন্যাস আপাতত এরকম কিছু দেখতে পারে:
- মাইপ্রসেসর
- MyProcessor_Sales
- MyProcessor_Sales_ReservOrdered
- MyProcessor_Sales_ReservPhysical
- MyProcessor_Sales
এখন, আপনি সহজেই সুপার ক্লাসে এমন একটি পদ্ধতি প্রয়োগ করতে পারেন যা একটি মডিউলইনভেন্টপারচসেলস এবং একটি স্ট্যাটাসইস্যু এনামের উপর ভিত্তি করে একটি সাবক্লাসকে তাত্ক্ষণিক করে। তবে প্রতিবার সাব ক্লাস যুক্ত করার সময় আপনাকে সুপার ক্লাসটি সংশোধন করতে হবে এবং এটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ে উত্তরাধিকারের ধারণা নয়। সর্বোপরি, প্রতিবার আপনি একটি নতুন ব্যাচের কাজ যুক্ত করার সময় আপনাকে রানবেসব্যাচ বা সিসঅপারেশন সার্ভিসবেস সংশোধন করতে হবে না।
পরিবর্তে, আপনি সিসএক্সটেনশন ফ্রেমওয়ার্কটি ব্যবহার করতে পারেন। এর জন্য আপনাকে আরও একটি ক্লাস যুক্ত করতে হবে, যা সিসঅ্যাট্রিবিউট প্রসারিত করা দরকার। এই ক্লাসটি আপনি আপনার প্রসেসিং ক্লাসগুলি সাজাতে পারেন এমন বৈশিষ্ট্য হিসাবে ব্যবহৃত হবে।
এই ক্লাসটি সিসঅপারেশন বাস্তবায়নের জন্য আপনি কীভাবে ডেটা কন্ট্রাক্ট ক্লাস তৈরি করবেন তার সাথে খুব মিল, এতে এই মানগুলি পেতে এবং সেট করার জন্য কিছু ডেটা সদস্য এবং পারম পদ্ধতি থাকবে।
আমাদের ক্ষেত্রে, ক্লাসডিক্লারেশনটি এরকম কিছু হতে পারে:
{
ModuleInventPurchSales module;
StatusIssue statusIssue;
StatusReceipt statusReceipt
}
সমস্ত ডেটা সদস্যকে তাত্ক্ষণিক করার জন্য আপনাকে একটি নতুন () পদ্ধতি তৈরি করতে হবে। আপনি ইচ্ছা করলে তাদের কিছু বা সবকটি ডিফল্ট মান দিতে পারেন, কিন্তু আমি তা করিনি।
StatusIssue _statusIssue,
StatusReceipt _statusReceipt)
{
;
super();
module = _module;
statusIssue = _statusIssue;
statusReceipt = _statusReceipt;
}
এবং আপনার প্রতিটি ডেটা সদস্যের জন্য একটি পারম পদ্ধতিও প্রয়োগ করা উচিত, তবে আমি সেগুলি এখানে বাদ দিয়েছি কারণ আমি নিশ্চিত যে আপনি কীভাবে এটি করবেন তা জানেন - অন্যথায়, আসুন এটি একটি অনুশীলন হিসাবে বিবেচনা করি ;-)
এখন আপনি আপনার প্রতিটি প্রসেসিং ক্লাস সাজাইয়া আপনার বৈশিষ্ট্য ক্লাস ব্যবহার করতে পারেন। উদাহরণস্বরূপ, ক্লাস ঘোষণাগুলি দেখতে এরকম হতে পারে:
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
{
}
আপনি অবশ্যই আপনার ক্লাসের যে কোনও উপায়ে নামকরণ করতে পারেন, এখানে গুরুত্বপূর্ণ অংশটি হ'ল আপনি আপনার ক্লাসগুলিকে এমন বৈশিষ্ট্যগুলির সাথে সজ্জিত করেন যা তারা কী ধরণের প্রক্রিয়াজাতকরণ করে তার সাথে মিলে যায় (তবে মনে রাখবেন যে ডায়নামিক্স এএক্সে শ্রেণির শ্রেণিবিন্যাসের জন্য নামকরণের কনভেনশন রয়েছে এবং সেগুলি অনুসরণ করা সর্বদা ভাল ধারণা, যদি সম্ভব হয়)।
এখন যেহেতু আপনি তাদের প্রত্যেকে কী ধরণের প্রক্রিয়াকরণ করেন তা সনাক্ত করার জন্য আপনার ক্লাসগুলি সজ্জিত করেছেন, আপনি প্রয়োজন অনুসারে সাব ক্লাসের অবজেক্টগুলি তাত্ক্ষণিক করতে সিসএক্সটেনশন ফ্রেমওয়ার্কের সুবিধা নিতে পারেন।
আপনার সুপার ক্লাসে (মাইপ্রসেসর), আপনি এর মতো একটি নির্মাণ পদ্ধতি যুক্ত করতে পারেন:
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;
}
সত্যিই আকর্ষণীয় অংশ - এবং সত্যিই এই পুরো পোস্টের বস্তু (শ্লেষ ক্ষমা করুন) - সিসএক্সটেনশনঅ্যাপক্লাসফ্যাক্টরি ক্লাসে গেটক্লাসফ্রমসিসঅ্যাট্রিবিউট () পদ্ধতি। এই পদ্ধতিটি যা করে তা হ'ল এটি একটি শ্রেণিবিন্যাসের সুপার ক্লাসের নাম গ্রহণ করে (এবং এই সুপার ক্লাসটি শ্রেণিবিন্যাসের শীর্ষে থাকার দরকার নেই; এর সহজ অর্থ হ'ল কেবলমাত্র এই শ্রেণিটি প্রসারিত ক্লাসগুলি যোগ্য হবে) এবং একটি বৈশিষ্ট্য বস্তু।
এরপরে এটি একটি ক্লাসের একটি অবজেক্ট ফেরত দেয় যা নির্দিষ্ট সুপার ক্লাসকে প্রসারিত করে এবং একটি সংশ্লিষ্ট বৈশিষ্ট্য দিয়ে সজ্জিত হয়।
আপনি স্পষ্টতই নির্মাণ পদ্ধতিতে যতটা চান ততটা বৈধতা বা যুক্তি যুক্ত করতে পারেন, তবে এখানে গুরুত্বপূর্ণ টেকওয়ে হ'ল একবার প্রয়োগ করা হলে আপনাকে আর কখনও এই পদ্ধতিটি সংশোধন করতে হবে না। আপনি শ্রেণিবিন্যাসে সাব ক্লাস যুক্ত করতে পারেন এবং যতক্ষণ না আপনি সেগুলি যথাযথভাবে সাজানোর বিষয়টি নিশ্চিত করেন, ততক্ষণ নির্মাণ পদ্ধতিটি সেগুলি খুঁজে পাবে যদিও এটি লেখার সময় তাদের অস্তিত্ব ছিল না।
পারফরম্যান্সের কী হবে? আমি সত্যই এটি বেঞ্চমার্ক করার চেষ্টা করি নি, তবে আমার অন্ত্রের অনুভূতি হ'ল এটি সম্ভবত ক্লাসিক স্যুইচ স্টেটমেন্ট ডিজাইনের চেয়ে খারাপ সম্পাদন করে। যাইহোক, ডায়নামিক্স এএক্সের বেশিরভাগ পারফরম্যান্স সমস্যাগুলি ডাটাবেস অ্যাক্সেসের কারণে ঘটে তা বিবেচনা করে, আমি এটি সম্পর্কে খুব বেশি চিন্তা করব না।
অবশ্যই, যদি আপনি এমন কিছু বাস্তবায়ন করছেন যা হাজার হাজার বস্তুর দ্রুত তৈরি করার প্রয়োজন হবে, আপনি আরও তদন্ত করতে চাইতে পারেন, তবে ক্লাসিক ক্ষেত্রে যেখানে আপনি কিছু দীর্ঘ প্রক্রিয়াকরণ করার জন্য কেবল একটি একক বস্তুকে তাত্ক্ষণিক করেন, আমি সন্দেহ করি এটি গুরুত্বপূর্ণ হবে। এছাড়াও, আমার সমস্যা সমাধানের টিপ (পরবর্তী অনুচ্ছেদ) বিবেচনা করে, এটি প্রদর্শিত হয় যে সিসএক্সটেনশন ফ্রেমওয়ার্কটি ক্যাশিংয়ের উপর নির্ভর করে, তাই একটি চলমান সিস্টেমে আমি সন্দেহ করি যে এটির একটি উল্লেখযোগ্য পারফরম্যান্স হিট রয়েছে। - সমস্যা সমাধান: যদি নির্মাণ পদ্ধতিটি আপনার সাব ক্লাসগুলি সঠিকভাবে সজ্জিত হওয়ার পরেও খুঁজে না পায় তবে এটি ক্যাচিংয়ের সমস্যা হতে পারে। ক্লায়েন্ট এবং সার্ভার উভয় ক্ষেত্রেই ক্যাশে সাফ করার চেষ্টা করুন। আসলে এওএস পুনরায় চালু করার প্রয়োজন নেই, তবে এটি শেষ অবলম্বন হতে পারে।