ডোমেন-চালিত-নকশা - সত্তা সমস্যার বাহ্যিক নির্ভরতা


23

আমি ডোমেন-চালিত-নকশা শুরু করতে চাই, তবে শুরু করার আগে বেশ কয়েকটি সমস্যা সমাধান করতে চাই :)

আসুন কল্পনা করুন আমার একটি গোষ্ঠী এবং ব্যবহারকারী রয়েছে এবং যখন ব্যবহারকারী কোনও দলে যোগদান করতে চান, আমি groupsService.AddUserToGroup(group, user)পদ্ধতিটি কল করছি । ডিডিডিতে আমার করা উচিত group.JoinUser(user), যা দেখতে বেশ ভাল লাগে।

যদি সমস্যাটি উপস্থিত হয় তবে আমি যদি কোনও ব্যবহারকারী যুক্ত করার জন্য কিছু বৈধতা বিধি আছে বা ব্যবহারকারীকে দলে যুক্ত করা হচ্ছে তখন কিছু বাহ্যিক কাজ শুরু করা দরকার। এই কাজগুলি করার ফলে বাহ্যিক নির্ভরতা থাকা সত্তার দিকে পরিচালিত হবে।

একটি উদাহরণ হতে পারে - এমন একটি বিধিনিষেধ যা ব্যবহারকারী কেবল সর্বোচ্চ 3 টি গ্রুপে অংশ নিতে পারে। এর জন্য গ্রুপের অভ্যন্তর থেকে ডিবি-কলগুলির প্রয়োজন হবে thisযৌন ব্যবহারকারী পদ্ধতিটি এটি যাচাই করার জন্য।

তবে কোনও সত্তা কিছু বাহ্যিক পরিষেবা / শ্রেণীর উপর নির্ভর করে তা আমার কাছে এত ভাল এবং "প্রাকৃতিক" বলে মনে হয় না।

ডিডিডিতে এটি মোকাবেলার উপযুক্ত উপায় কী?

উত্তর:


15

আসুন কল্পনা করুন যে আমার কাছে একটি গোষ্ঠী এবং ব্যবহারকারী রয়েছে এবং যখন ব্যবহারকারী কোনও গোষ্ঠীতে যোগদান করতে চান, আমি গোষ্ঠীগুলিকে সার্ভিস কল করি। ডিডিডিতে আমার গ্রুপ করা উচিত .জউইন ইউজার (ব্যবহারকারী) যা দেখতে বেশ ভাল দেখাচ্ছে।

তবে ডিডিডি আপনাকে কার্য সম্পাদনের জন্য (স্টেটলেস) পরিষেবাগুলি ব্যবহার করতে উত্সাহ দেয়, যদি হাতের কাজটি খুব জটিল হয় বা কোনও সত্তার মডেলের সাথে ফিট না হয়। ডোমেন স্তরে পরিষেবা থাকা ঠিক আছে। তবে ডোমেন স্তরের পরিষেবাগুলিতে কেবল ব্যবসায়ের যুক্তি অন্তর্ভুক্ত করা উচিত। অন্যদিকে বাহ্যিক কাজ এবং অ্যাপ্লিকেশন যুক্তি (যেমন কোনও ইমেল প্রেরণের জন্য), অ্যাপ্লিকেশন স্তরে ডোমেন পরিষেবাটি ব্যবহার করা উচিত, যাতে আপনার এটি পৃথক (অ্যাপ্লিকেশন) পরিষেবা মোড়ানো থাকতে পারে।

সমস্যাটি উপস্থিত হয় যদি আমি কোনও ব্যবহারকারী যুক্ত করার জন্য কিছু বৈধতা নিয়ম ...

বৈধকরণের নিয়মগুলি ডোমেন মডেলের অন্তর্গত! এগুলি ডোমেন অবজেক্টের (সত্তা ইত্যাদি) অভ্যন্তরে আবদ্ধ হওয়া উচিত।

... বা কিছু বাহ্যিক কাজ শুরু করা দরকার যখন ব্যবহারকারীকে দলে যুক্ত করা হয়। এই কাজগুলি করার ফলে বাহ্যিক নির্ভরতা থাকা সত্তার দিকে পরিচালিত হবে।

আপনি কোন ধরণের বাহ্যিক কাজটির কথা বলছেন তা আমি জানি না, তবে আমি এটি ইমেল প্রেরণের মতো কিছু বলে ধরে নিয়েছি But তবে এটি সত্যিই আপনার ডোমেন মডেলের অংশ নয়। এটি অ্যাপ্লিকেশন স্তরে থাকতে হবে এবং সেখানে imolded করা উচিত। আপনার অ্যাপ্লিকেশন স্তরে এমন একটি পরিষেবা থাকতে পারে যা এই কাজগুলি সম্পাদন করার জন্য ডোমেন পরিষেবা এবং সত্তাগুলিতে কাজ করে।

তবে কোনও সত্তা কিছু বাহ্যিক পরিষেবা / শ্রেণীর উপর নির্ভর করে তা আমার কাছে এত ভাল এবং "প্রাকৃতিক" বলে মনে হয় না।

এটি অপ্রাকৃত এবং এটি হওয়া উচিত নয়। সত্তাকে এমন জিনিসপত্র সম্পর্কে জানা উচিত নয় যা এটির দায়িত্ব নয়। পরিষেবাদি সত্তা ইন্টারঅ্যাকশন অর্কেস্ট্রেট করতে ব্যবহার করা উচিত।

ডিডিডিতে এটি মোকাবেলার উপযুক্ত উপায় কী?

আপনার ক্ষেত্রে, সম্পর্কটি সম্ভবত দ্বিপাক্ষিক হওয়া উচিত। ব্যবহারকারী গ্রুপে যোগ দেয় বা গোষ্ঠী ব্যবহারকারী নেয় কিনা তা আপনার ডোমেনের উপর নির্ভর করে। ব্যবহারকারী কি দলে যোগ দেয়? বা ব্যবহারকারীকে একটি দলে যুক্ত করা হয়েছে? এটি আপনার ডোমেনে কীভাবে কাজ করে?

যাইহোক, আপনার একটি দ্বিপাক্ষিক সম্পর্ক রয়েছে এবং এভাবে ব্যবহারকারী ইতিমধ্যে ব্যবহারকারী-সামগ্রীর মধ্যে কতগুলি গ্রুপের অন্তর্ভুক্ত তা নির্ধারণ করতে পারেন। একবার আপনি দায়িত্বশীল শ্রেণি নির্ধারণ করার পরে আপনি ব্যবহারকারীকে গোষ্ঠীতে বা গোষ্ঠীতে পাস করার বিষয়টি প্রযুক্তিগতভাবে নগণ্য Whether

বৈধতাটি সত্তার দ্বারা সম্পাদন করা উচিত। অ্যাপ্লিকেশন স্তরটির পরিষেবা থেকে পুরো জিনিসটি কল করা হয় যা প্রযুক্তিগত জিনিসগুলি যেমন ইমেল প্রেরণ ইত্যাদিও করতে পারে do

তবে, যদি বৈধতা যুক্তিটি সত্যিই জটিল হয় তবে একটি ডোমেন পরিষেবা আরও ভাল সমাধান হতে পারে। সেক্ষেত্রে ব্যবসায়ের নিয়মগুলি সেখানে encুকিয়ে দিন এবং তারপরে আপনার অ্যাপ্লিকেশন স্তর থেকে কল করুন।


কিন্তু যদি আমরা সত্তার বাইরে এত যুক্তি সরিয়ে রাখি তবে ভিতরে কী রাখা উচিত?
সাইবেরিয়ানগুই

সত্তার প্রত্যক্ষ দায়িত্ব! উদাহরণস্বরূপ আপনি যদি "ব্যবহারকারী কোনও গোষ্ঠীতে যোগ দিতে পারেন" বলতে পারেন তবে এটি ব্যবহারকারী সত্তার একটি দায়িত্ব। প্রযুক্তিগত কারণে কখনও কখনও আপনাকে ট্রেড অফের সিদ্ধান্ত নিতে হয়। আমি উভয় দিকনির্দেশক সম্পর্কের বড় অনুরাগী নই, তবে কখনও কখনও এটি মডেলটির সাথে সবচেয়ে ভাল ফিট করে। সুতরাং ডোমেন সম্পর্কে কথা বলার সময় মনোযোগ দিয়ে শুনুন। "একটি সত্তা করে ..." "সত্তাটি পারে ..." আপনি যখন এই জাতীয় বাক্যগুলি শোনেন, তখন এই ক্রিয়াকলাপগুলি সম্ভবত সত্তার অন্তর্গত।
ফ্যালকন

তদ্ব্যতীত, আপনি জানেন যে আপনার যখন একটি পরিষেবা প্রয়োজন তখন যখন দুটি বা ততোধিক সম্পর্কযুক্ত কোনও জিনিস কোনও কাজ সম্পাদনের জন্য কোনও কাজে অংশ নেওয়া প্রয়োজন।
ফ্যালকন

1
আপনার উত্তরের জন্য ধন্যবাদ, ফ্যালকন! বিটিডব্লিউ, আমি সর্বদা রাষ্ট্রহীন পরিষেবাগুলি ব্যবহার করার চেষ্টা করেছি, সুতরাং আমি ডিডিডি-র এক ধাপ কাছাকাছি :) চলুন আমরা বলি যে কোনও ডোমেনে এই ইউজারজিনটোগ গ্রুপটি অপারেশন গ্রুপের অন্তর্গত। সমস্যাটি হ'ল এই অপারেশনটি বৈধতা দেওয়ার জন্য আমাকে জানতে হবে যে ব্যবহারকারী ইতিমধ্যে কতগুলি গ্রুপে অংশ নিয়েছে (কোনও অপারেশন যদি এটি ইতিমধ্যে>> অস্বীকার করতে হয় তবে এটি ইতিমধ্যে> 3)। এটি জানতে আমার ডাটাবেসটি জিজ্ঞাসা করা দরকার। আমি কীভাবে গ্রুপ সত্তা থেকে এটি করতে পারি? আমি আরও কিছু উদাহরণ পেয়েছি, যখন আমাকে অপারেশনগুলিতে প্রাকৃতিকভাবে সত্তার অন্তর্ভুক্ত হওয়া উচিত ডিবিগুলিকে স্পর্শ করতে হবে (প্রয়োজনে আমি তাদের পোস্ট করব :))
শাদিক্স

2
ঠিক আছে, আমি যদি এটি সম্পর্কে চিন্তা করি: একটি গ্রুপমেম্বারশিপ সত্তা সম্পর্কে কী? এটি একটি কারখানা দ্বারা নির্মিত হতে পারে এবং এই কারখানাটি রিসোসিটরিগুলিতে অ্যাক্সেস করতে পারে। এটি ভাল ডিডিডি হতে পারে এবং সদস্যতা তৈরির ব্যবস্থা করে। কারখানাটি সংগ্রহস্থলগুলিতে অ্যাক্সেস করতে পারে, সদস্যতা তৈরি করতে পারে এবং এর চেয়ে যথাক্রমে ব্যবহারকারী এবং গোষ্ঠীতে এটি যুক্ত করে। এই নতুন সত্ত্বা সুবিধাগুলিও encapsulate করতে পারে। সম্ভবত এটি একটি ভাল ধারণা।
ফ্যালকন

3

যাচাইকরণের সমস্যায় আমি যেভাবে যোগাযোগ করব সেগুলি হ'ল: একটি ডোমেন পরিষেবা তৈরি করুন MembershipService:

class MembershipService : IMembershipService
{
   public MembershipService(IGroupRepository groupRepository)
   { 
     _groupRepository = groupRepository;
   }
   public int NumberOfGroupsAssignedTo(UserId userId)
   {
        return _groupsRepository.NumberOfGroupsAssignedTo(userId);
   }
}

গ্রুপ সত্তা ইনজেকশন করা প্রয়োজন IMemberShipService। এটি ক্লাস স্তর বা পদ্ধতি পর্যায়ে করা যেতে পারে। ধরে নেওয়া যাক আমরা পদ্ধতি স্তরে এটি করি।

class Group{

   public void JoinUser(User user, IMembershipService membershipService)
   {
       if(membershipService.NumberOfGroupsAssignedTo(user.UserId) >= 3)
         throw new BusinessException("User assigned to more than 3 groups. Cannot proceed");

       // do some more stuff
   }
}

অ্যাপ্লিকেশন পরিষেবা: কনস্ট্রাক্টর ইঞ্জেকশন ব্যবহার করে ইনজেকশন দেওয়া GroupServiceযেতে পারে IMemberShipService, যা এটি ক্লাসের JoinUserপদ্ধতিতে পাস করতে পারে Group


1
আপনি পঠনযোগ্যতার জন্য আপনার পোস্টে উত্স কোডটি ফর্ম্যাট করতে বিবেচনা করতে পারেন
বেন্নি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.