थोड़ा सा डोमेन ज्ञान
मैं एक पीओएस (प्वाइंट ऑफ सेल्स) सॉफ्टवेयर लिख रहा हूं जो सामान का भुगतान करने या उन्हें वापस करने की अनुमति देता है। भुगतान या रिफंड करते समय, किसी को निर्दिष्ट करने की आवश्यकता है कि धन हस्तांतरण का उपयोग करने के लिए क्या अर्थ है: नकद, ईएफटी (~ = क्रेडिट कार्ड), वफादारी कार्ड, वाउचर, आदि।
इन मनी ट्रांसफर का मतलब है एक सीमित और मूल्यों का ज्ञात सेट (एक प्रकार का ईनाम)।
मुश्किल हिस्सा यह है कि मुझे पीओएस टर्मिनल पर भुगतान और धनवापसी (दोनों सेट अलग-अलग हो सकते हैं) के लिए इन साधनों का एक कस्टम सबसेट स्टोर करने में सक्षम होना चाहिए।
उदाहरण के लिए:
- उपलब्ध भुगतान का अर्थ है: नकद, ईएफ़टी, लॉयल्टी कार्ड, वाउचर
- उपलब्ध धनवापसी का अर्थ है: नकद, वाउचर
कार्यान्वयन की वर्तमान स्थिति
मैं निम्नलिखित के रूप में धन हस्तांतरण की अवधारणा को लागू करने का चयन करता हूं:
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 का उपयोग करें: भुगतान / धनवापसी के नए सेट को परिभाषित करें
- सभी मौजूदा भुगतान / धनवापसी साधनों को हटा दें
- नया डालें
केस 2 का उपयोग करें: सभी भुगतान / धनवापसी साधनों को पुनः प्राप्त करें
- सभी संग्रहीत भुगतान / धनवापसी साधनों का एक संग्रह प्राप्त करें
मुसीबत
मैं हठ पहलू पर अपने मौजूदा डिजाइन के साथ फंस गया हूं। मैं NHibernate (FluentNHibernate के साथ वर्ग मानचित्र घोषित करने के लिए) का उपयोग कर रहा हूं और मुझे इसे कुछ मान्य DB स्कीमा में मैप करने का तरीका नहीं मिल रहा है।
मैंने पाया कि इकाई-नाम का उपयोग करके कई बार कक्षा को मैप करना संभव है लेकिन मुझे यकीन नहीं है कि यह उपवर्गों के साथ संभव है।
मैं जो करने के लिए तैयार नहीं हूं, वह है MoneyTransferMean सार्वजनिक एपीआई को बदलने के लिए इसे जारी रखने में सक्षम होना (उदाहरण के bool isRefund
लिए दोनों के बीच अंतर करना)। हालाँकि कुछ निजी विवेचक क्षेत्र को जोड़ना या ठीक है।
मेरी वर्तमान मानचित्रण:
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
।
मैंने उपवर्ग मैपिंग की नकल करने की भी कोशिश की, लेकिन मैं "पैरेंट मैपिंग" निर्दिष्ट करने में असमर्थ हूं, जो मुझे ऊपर के समान अपवाद की ओर ले जाता है।
सवाल
क्या मेरी मौजूदा डोमेन संस्थाओं को बनाए रखने के लिए कोई समाधान मौजूद है?
यदि नहीं, तो मुझे अपनी संस्थाओं पर NHibnernate के साथ लगातार बने रहने के लिए सबसे छोटा रिफ्लेक्टर क्या होगा?
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
संपत्ति महान है।