আমি বেশ কিছুদিন ধরেই দরিদ্র লোকের সিকিউআরএস 1 কে মানিয়ে নিচ্ছি কারণ আমি এক ডেটা স্টোরে গ্রানুলার ডেটা রাখার নমনীয়তা পছন্দ করি, বিশ্লেষণের জন্য দুর্দান্ত সম্ভাবনা সরবরাহ করে এবং তাই ব্যবসায়ের মান বাড়িয়ে তোলে এবং যখন বর্ধিত পারফরম্যান্সের জন্য ডেনারমালাইজড ডেটা যুক্ত পাঠের জন্য অন্য প্রয়োজন হয় ।
তবে দুর্ভাগ্যক্রমে আমি শুরু থেকেই সমস্যার সাথে লড়াই করে চলেছি যেখানে ঠিক এই ধরণের আর্কিটেকচারে আমার ব্যবসার যুক্তি রাখা উচিত।
আমি যা বুঝি সেগুলি থেকে, একটি আদেশ হ'ল উদ্দেশ্য যোগাযোগ করার একটি মাধ্যম এবং নিজের দ্বারা কোনও ডোমেনের সাথে তার সম্পর্ক নেই। এগুলি মূলত ডেটা (বোবা - যদি আপনি চান) স্থানান্তর বস্তু objects এটি হ'ল কমান্ডগুলি বিভিন্ন প্রযুক্তির মধ্যে সহজেই স্থানান্তরযোগ্য। সফলভাবে সম্পন্ন ইভেন্টগুলির প্রতিক্রিয়া হিসাবে একই ইভেন্টগুলিতে প্রযোজ্য।
একটি সাধারণ ডিডিডি অ্যাপ্লিকেশনটিতে ব্যবসায়ের যুক্তি সত্তা, মান বস্তু, সামগ্রিক শিকড়গুলির মধ্যে থাকে they এগুলি ব্যবহারের পাশাপাশি আচরণের পাশাপাশি উভয়ই সমৃদ্ধ। কিন্তু একটি আদেশ একটি ডোমেন অবজেক্ট নয় সুতরাং এটি ডেটার ডোমেন উপস্থাপনার মধ্যে সীমাবদ্ধ হওয়া উচিত নয় কারণ এটি তাদের উপর খুব বেশি চাপ সৃষ্টি করে।
সুতরাং আসল প্রশ্নটি: যুক্তিটি ঠিক কোথায়?
আমি খুঁজে পেয়েছি যে আমি বেশিরভাগ সময় এই জটিলতার মুখোমুখি হয়েছি যখন একটি জটিল জটিল সামগ্রীর নির্মাণের চেষ্টা করে যা এর মানগুলির সংমিশ্রণ সম্পর্কে কিছু নিয়ম নির্ধারণ করে। এছাড়াও, ডোমেন অবজেক্টগুলির মডেলিংয়ের সময় আমি ব্যর্থ-দ্রুত দৃষ্টান্ত অনুসরণ করতে পছন্দ করি , যখন কোনও বস্তু কোনও পদ্ধতিতে পৌঁছায় তা বৈধ অবস্থায় থাকে in
ধরা যাক সামগ্রিকভাবে Car
দুটি উপাদান ব্যবহার করা হয়েছে:
Transmission
,Engine
।
উভয় Transmission
এবং Engine
মান বস্তু সুপার টাইপ হিসাবে উপস্থাপিত হয় এবং যথাক্রমে উপ প্রকার, Automatic
এবং Manual
সংক্রমণ, বা Petrol
এবং Electric
ইঞ্জিন রয়েছে।
এই ডোমেনে, নিজেরাই বেঁচে থাকা একটি সফলভাবে তৈরি করা হোক Transmission
, সে হোক Automatic
বা Manual
, অথবা যে কোনও একটি Engine
সম্পূর্ণরূপে ভাল। তবে Car
সমষ্টিগত কয়েকটি নতুন নিয়ম প্রবর্তন করে, কেবল তখনই প্রযোজ্য যখন Transmission
এবং Engine
বস্তুগুলি একই প্রসঙ্গে ব্যবহৃত হবে। যথা:
- যখন কোনও গাড়ি
Electric
ইঞ্জিন ব্যবহার করে তবে কেবলমাত্র অনুমোদিত ট্রান্সমিশন টাইপAutomatic
। - যখন কোনও গাড়ি
Petrol
ইঞ্জিন ব্যবহার করে তখন এটির মধ্যে উভয় প্রকারের থাকতে পারেTransmission
।
কমান্ড তৈরির স্তরে আমি এই উপাদান সংমিশ্রণ লঙ্ঘনটি ধরতে পারি, তবে আমি আগেই বলেছি যে, আমি যা বুঝতে পারি তা করা উচিত নয় কারণ কমান্ডটিতে তখন ব্যবসায়িক যুক্তি থাকতে পারে যা ডোমেন স্তরকে সীমাবদ্ধ করা উচিত।
বিকল্পগুলির মধ্যে একটি হ'ল এই ব্যবসায়ের লজিক বৈধকরণকে কমান্ড ভ্যালিডেটর নিজেই স্থানান্তরিত করা, তবে এটিও ঠিক বলে মনে হয় না। মনে হচ্ছে আমি কমান্ডটি ডিকনস্ট্রাক্ট করব, গেটার্স ব্যবহার করে পুনরুদ্ধার করা এর বৈশিষ্ট্যগুলি যাচাই করে এবং বৈধকারীর মধ্যে তাদের তুলনা করে ফলাফলগুলি পরিদর্শন করব। এটি আমার কাছে ডেমিটারের আইন লঙ্ঘনের মতো চিৎকার করে ।
উল্লিখিত বৈধতা বিকল্পটি বাতিল করা কারণ এটি কার্যকর হবে বলে মনে হচ্ছে না, মনে হচ্ছে কোনওটি আদেশটি ব্যবহার করা উচিত এবং এটি থেকে সমষ্টিটি তৈরি করা উচিত। তবে এই যুক্তিটি কোথায় থাকবে? এটি কংক্রিট কমান্ড পরিচালনার জন্য দায়বদ্ধ হ্যান্ডলারের মধ্যে থাকা উচিত? অথবা এটি সম্ভবত কমান্ড যাচাইকারীর মধ্যে থাকা উচিত (আমিও এই পদ্ধতির পছন্দ করি না)?
আমি বর্তমানে একটি কমান্ড ব্যবহার করছি এবং দায়বদ্ধ কমান্ড হ্যান্ডলারের মধ্যে এটি থেকে একটি সমষ্টি তৈরি করব। তবে আমি যখন এটি করি, আমার কাছে যদি কোনও কমান্ড যাচাইকারক থাকে তবে এতে কোনও কিছুই থাকতে পারে না, কারণ CreateCar
কমান্ডটি উপস্থিত থাকলে এটিতে এমন উপাদানগুলি থাকতে পারে যা আমি জানি যে পৃথক ক্ষেত্রে বৈধ তবে সমষ্টিগত পৃথক বলতে পারে।
আসুন কল্পনা করুন একটি ভিন্ন দৃশ্যের বিভিন্ন বৈধতা প্রক্রিয়া মিশ্রণ - একটি CreateUser
কমান্ড ব্যবহার করে একটি নতুন ব্যবহারকারী তৈরি ।
কমান্ডটিতে এমন Id
একটি ব্যবহারকারী রয়েছে যা তৈরি করা হবে এবং তাদের Email
।
সিস্টেমটি ব্যবহারকারীর ইমেল ঠিকানার জন্য নিম্নলিখিত বিধিগুলি জানিয়েছে:
- অবশ্যই অনন্য হবে,
- খালি থাকতে হবে না,
- সর্বাধিক 100 টি অক্ষর থাকতে হবে (একটি ডিবি কলামের সর্বাধিক দৈর্ঘ্য)।
এই ক্ষেত্রে, যদিও একটি অনন্য ইমেল থাকা একটি ব্যবসায়ের নিয়ম, এটি একটি সামগ্রিকভাবে পরীক্ষা করা খুব সামান্য বোঝায়, কারণ আমাকে সিস্টেমের বর্তমান ইমেলগুলির পুরো সেটটি একটি স্মৃতিতে লোড করতে হবে এবং কমান্ডের ইমেলটি পরীক্ষা করতে হবে would সামগ্রিক ( আইক! কিছু, কিছু, পারফরম্যান্স।) এর বিপরীতে । সেই কারণে, আমি এই চেকটি কমান্ড যাচাইকারীর কাছে নিয়ে যাব, যা UserRepository
নির্ভরতা হিসাবে গ্রহণ করবে এবং কমান্ডের সাথে উপস্থিত ইমেল সহ কোনও ব্যবহারকারী ইতিমধ্যে উপস্থিত আছে কিনা তা পরীক্ষা করতে os
এটি যখন আসে তখন হঠাৎ করে কমান্ড যাচাইকারীকে অন্য দুটি ইমেল বিধিও বদ্ধমূল করে তোলে। তবে আমার একটা অনুভূতি আছে যে নিয়মগুলি একটি User
সামগ্রীর মধ্যে সত্যই উপস্থিত হওয়া উচিত এবং কমান্ড যাচাইকারীর কেবলমাত্র স্বতন্ত্রতা সম্পর্কে যাচাই করা উচিত এবং যদি বৈধতা সাফল্য লাভ করে তবে আমার মধ্যে User
সামগ্রিক তৈরি করার জন্য এগিয়ে যেতে হবে CreateUserCommandHandler
এবং এটি সংরক্ষণের জন্য একটি সংগ্রহস্থলে পাস করা উচিত।
আমি এটির মতো অনুভব করছি কারণ সংগ্রহস্থলের সংরক্ষণের পদ্ধতিটি একটি সমষ্টি গ্রহণ করতে পারে যা নিশ্চিত করে যে একবার সমষ্টিটি পাস হওয়ার পরে সমস্ত আক্রমণকারী পূর্ণ হয়। যুক্তিটি (যেমন শূন্যপদহীনতা) কেবলমাত্র কমান্ড বৈধকরণের মধ্যে উপস্থিত থাকলে অন্য কোনও প্রোগ্রামার এই বৈধতাটিকে পুরোপুরি এড়িয়ে যেতে পারে এবং সরাসরি UserRepository
কোনও User
অবজেক্টের সাহায্যে সেভ পদ্ধতিতে কল করতে পারে যা মারাত্মক ডাটাবেস ত্রুটির দিকে পরিচালিত করতে পারে, কারণ ইমেলটিতে থাকতে পারে খুব দীর্ঘ হয়েছে।
কীভাবে আপনি ব্যক্তিগতভাবে এই জটিল বৈধতা এবং রূপান্তরগুলি পরিচালনা করবেন? আমি আমার সমাধানটি নিয়ে বেশিরভাগই খুশি, তবে আমার মনে হয় যে আমার কাছে নিশ্চিত হওয়া দরকার যে আমার ধারণাগুলি এবং পন্থাগুলি পছন্দগুলির সাথে পুরোপুরি খুশি হওয়ার জন্য সম্পূর্ণ বোকা নয়। আমি সম্পূর্ণ ভিন্ন পদ্ধতির জন্য সম্পূর্ণ উন্মুক্ত। আপনার ব্যক্তিগতভাবে কিছু চেষ্টা করার জন্য এবং আপনার জন্য খুব ভাল কাজ করার মতো কিছু থাকলে আমি আপনার সমাধানটি দেখতে আগ্রহী।
1 টি পিএইচপি বিকাশকারী হিসাবে কাজ করা RESTful সিস্টেম তৈরির জন্য দায়বদ্ধ আমার CQRS- এর ব্যাখ্যাটি স্ট্যান্ডার্ড অ্যাসিঙ্ক -কমান্ড-প্রসেসিং পদ্ধতির থেকে কিছুটা বিচ্যুত হয় , যেমন কখনও কখনও প্রসেসিং কমান্ডের সিঙ্ক্রোনালি প্রয়োজনের কারণে আদেশগুলি থেকে ফলাফল ফিরে আসে।
CommandDispatcher
।