ডোমেন জ্ঞান একটি বিট
আমি একটি পস (বিক্রয় বিক্রয়) সফ্টওয়্যার লিখছি যা পণ্যগুলি প্রদান করতে বা তাদের ফেরত দিতে দেয়। অর্থ প্রদান বা ফেরত দেওয়ার সময়, কোনও অর্থ স্থানান্তরের অর্থ কী তা বোঝাতে হবে: নগদ, ইএফটি (credit = ক্রেডিট কার্ড), আনুগত্য কার্ড, ভাউচার ইত্যাদি
এই অর্থ স্থানান্তর অর্থ একটি সীমাবদ্ধ এবং মূল্যবান সেট (এক প্রকার এনাম) set
জটিল অংশটি হ'ল আমি পস টার্মিনালে অর্থ প্রদান এবং ফেরত উভয় (দুটি সেট আলাদা হতে পারে) এর জন্য এই উপায়গুলির একটি কাস্টম সাবসেট সঞ্চয় করতে সক্ষম হওয়া প্রয়োজন।
উদাহরণ স্বরূপ:
- উপলব্ধ অর্থ প্রদানের অর্থ: নগদ, EFT, আনুগত্য কার্ড, ভাউচার
- উপলব্ধ অর্থ ফেরতের অর্থ: নগদ, ভাউচার
বাস্তবায়নের বর্তমান অবস্থা
আমি অর্থ স্থানান্তর ধারণাটি বাস্তবায়িত করতে বেছে নিই:
public abstract class MoneyTransferMean : AggregateRoot
{
public static readonly MoneyTransferMean Cash = new CashMoneyTransferMean();
public static readonly MoneyTransferMean EFT = new EFTMoneyTransferMean();
// and so on...
//abstract method
public class CashMoneyTransferMean : MoneyTransferMean
{
//impl of abstract method
}
public class EFTMoneyTransferMean : MoneyTransferMean
{
//impl of abstract method
}
//and so on...
}
এটি "প্লেইন এনাম" না হওয়ার কারণ হ'ল এই শ্রেণীর ভিতরে কিছু আচরণ রয়েছে। ফ্লুয়েন্টএনহাইবারনেট ম্যাপিংয়ে তাদের রেফারেন্স করার জন্য আমাকে অভ্যন্তরীণ ক্লাসগুলি (ব্যক্তিগত পরিবর্তে) সর্বজনীন ঘোষণা করতে হয়েছিল (নীচে দেখুন)।
এটি কীভাবে ব্যবহৃত হয়
পেমেন্ট এবং রিফান্ড উভয় মাধ্যমই সর্বদা ডিবিতে / হিসাবে সেট হিসাবে সঞ্চয় বা পুনরুদ্ধার করা হয়। উভয় সেটের অভ্যন্তরে কিছু মান একই হতে পারে যদিও এগুলি দুটি স্বতন্ত্র সেট।
কেস 1 ব্যবহার করুন: অর্থ প্রদান / ফেরতের অর্থের একটি নতুন সেট সংজ্ঞায়িত করুন
- সমস্ত বিদ্যমান অর্থ প্রদান / ফেরতের অর্থ মুছুন
- নতুন Inোকান
কেস 2 ব্যবহার করুন: সমস্ত অর্থ প্রদান / ফেরতের অর্থ পুনরুদ্ধার করুন
- সমস্ত সঞ্চিত অর্থ প্রদান / ফেরতের অর্থের সংগ্রহ পান
সমস্যা
আমি অধ্যবসায় দিকটি নিয়ে আমার বর্তমান ডিজাইনের সাথে আটকে আছি। আমি NHibernate ব্যবহার করছি (শ্রেণীর মানচিত্র ঘোষণার জন্য ফ্লুয়েটএনহাইবারনেট সহ) এবং আমি এটির কোনও বৈধ ডিবি স্কিমায় মানচিত্রের কোনও উপায় খুঁজে পাচ্ছি না।
আমি দেখেছি যে সত্তা-নাম ব্যবহার করে একাধিকবার একটি শ্রেণীর মানচিত্র করা সম্ভব তবে তবে আমি নিশ্চিত নই যে এটি সাবক্লাসগুলি দিয়ে সম্ভব।
আমি যা করতে প্রস্তুত নই তা মানি ট্রান্সফারমিন পাবলিক এপিআই এটির ধারাবাহিকতা ধরে রাখতে সক্ষম করে (উদাহরণস্বরূপ উভয়ের bool isRefund
মধ্যে পার্থক্য করার জন্য একটি যোগ করা ) al তবে কিছু ব্যক্তিগত বৈষম্যমূলক ক্ষেত্র যুক্ত করা ঠিক আছে।
আমার বর্তমান ম্যাপিং:
public sealed class MoneyTransferMeanMap : ClassMap<MoneyTransferMean>
{
public MoneyTransferMeanMap()
{
Id(Entity.Expressions<MoneyTransferMean>.Id);
DiscriminateSubClassesOnColumn("Type")
.Not.Nullable();
}
}
public sealed class CashMoneyTransferMeanMap : SubclassMap<MoneyTransferMean.CashMoneyTransferMean>
{
public CashMoneyTransferMeanMap()
{
DiscriminatorValue("Cash");
}
}
public sealed class EFTMoneyTransferMeanMap : SubclassMap<MoneyTransferMean.EFTMoneyTransferMean>
{
public EFTMoneyTransferMeanMap()
{
DiscriminatorValue("EFT");
}
}
//and so on...
এই ম্যাপিংটি কম্পাইল করে তবে এটি কেবল 1 টি টেবিল তৈরি করে এবং এই টেবিলটি জিজ্ঞাসা করার সময় আমি অর্থ প্রদান / ফেরতের মধ্যে পার্থক্য করতে সক্ষম নই।
আমি দুটি MoneyTransferMean
টেবিলে এবং সত্তা-নাম উভয়ের সাথে উল্লেখ করে দুটি ম্যাপিংস ঘোষণার চেষ্টা করেছি তবে এটি আমাকে একটি ব্যতিক্রমের দিকে নিয়ে যায় Duplicate class/entity mapping MoneyTransferMean+CashMoneyTransferMean
।
আমি সাবক্লাস ম্যাপিংগুলিও নকল করার চেষ্টা করেছি কিন্তু আমি "প্যারেন্ট ম্যাপিং" নির্দিষ্ট করতে অক্ষম যা আমাকে উপরের মত একই ব্যতিক্রমের দিকে নিয়ে যায়।
প্রশ্ন
আমার বর্তমান ডোমেন সত্তাগুলি ধরে রাখতে কোনও সমাধান কি বিদ্যমান?
যদি তা না হয় তবে আমার সত্তাগুলি এনএইচবার্নেটে অবিচল রাখার জন্য আমার সবচেয়ে ছোট রেফ্যাক্টরটি কী হবে?
What I'm not ready to do is to alter the MoneyTransferMean public API to be able to persist it (for example adding a bool isRefund to differentiate between the two).
: কেন না? এটি সহজ এবং মধুর পরিবর্তন যা আপনার সমস্যার সমাধান করা উচিত। আপনি তিনটি সম্ভাব্য মান আপ করতে পারেন (যদিও দুই এছাড়াও ডুপ্লিকেট রেকর্ড বা কি করতে হবেFlag
টাইপ):Payment
,Refund
,Both
। যদি দুটি মান আপনার জন্য করে তবেbool
সম্পত্তি দুর্দান্ত।