বিভিন্ন সারণীতে একই সত্তা ম্যাপিং


9

ডোমেন জ্ঞান একটি বিট

আমি একটি পস (বিক্রয় বিক্রয়) সফ্টওয়্যার লিখছি যা পণ্যগুলি প্রদান করতে বা তাদের ফেরত দিতে দেয়। অর্থ প্রদান বা ফেরত দেওয়ার সময়, কোনও অর্থ স্থানান্তরের অর্থ কী তা বোঝাতে হবে: নগদ, ইএফটি (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

আমি সাবক্লাস ম্যাপিংগুলিও নকল করার চেষ্টা করেছি কিন্তু আমি "প্যারেন্ট ম্যাপিং" নির্দিষ্ট করতে অক্ষম যা আমাকে উপরের মত একই ব্যতিক্রমের দিকে নিয়ে যায়।

প্রশ্ন

আমার বর্তমান ডোমেন সত্তাগুলি ধরে রাখতে কোনও সমাধান কি বিদ্যমান?

যদি তা না হয় তবে আমার সত্তাগুলি এনএইচবার্নেটে অবিচল রাখার জন্য আমার সবচেয়ে ছোট রেফ্যাক্টরটি কী হবে?


1
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সম্পত্তি দুর্দান্ত।
অমিত যোশী

1
আপনি কেন এই পেমেন্ট পদ্ধতিগুলি ডাটাবেসে সংরক্ষণ করতে চান? নাম বাদে ওখানকার রাজ্য কী?
বেরলাক

@ আমিতজোশি যদিও এই ধরনের একটি ছোট্ট পরিবর্তন সমস্যার সমাধান করতে পারে (তলদেশে), আমি যুক্তি যুক্ত করা এড়াতে চাই যা আমার ডোমেনে ব্যবসায় সম্পর্কিত নয় related
ot

@ বিড়ালাক সত্যই, ডাটাবেসগুলিতে এগুলি সংরক্ষণ করা কিছুটা জটিল বলে মনে হচ্ছে। তবে এই প্রকল্পের একটি প্রয়োজনীয়তা যা সমস্ত রাজ্য ডাটাবেসে থাকা উচিত।
স্পন্দিত

উত্তর:


0

আপনি কেন সমস্ত সাধারণ সম্পত্তি (ক্ষেত্র) সহ একটি একক সত্তা মানি ট্রান্সফারমিন তৈরি করেন না এবং এই অর্থের ট্রান্সফারমিয়ান হয় পেমেন্ট বা রিফান্ড, বা উভয়ই কিনা তা নির্ধারণ করার জন্য মাত্র 2 টি অতিরিক্ত ক্ষেত্র (বুলিয়ান) যুক্ত করবেন না ???? এটি অবিরত রাখুন বা রাখবেন না।

এছাড়াও এটি আইডি (পিকে) এর সাথে অতিরিক্ত সত্তা দিয়েও করা যেতে পারে, একই অতিরিক্ত ক্ষেত্র যুক্ত করুন, মানি ট্রান্সফারমিনের সাথে সম্পর্ক 1: 1 হবে। কুৎসিত, আমি জানি, তবে এটি কাজ করা উচিত।


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

0

আমি দ্বিতীয় হয়ে যাব এবং @ ডিভিএক্সএক্স 75 এর পরামর্শ অনুসারে যুক্ত করব, যাতে আপনার লেনদেনের ধরণগুলি একইরকম ধারণাকে মূলত বর্ণনা করে, যদিও অন্যটি হ'ল অন্যটি হয়। যদিও আমি সম্ভবত একটি মাত্র বুলিয়ান ক্ষেত্র যুক্ত করব এবং অর্থ প্রদানের অর্থ ফেরতের বিষয়টি আলাদা করার জন্য পৃথক রেকর্ড রাখব।

ধরে নিই আপনার একটি ইউআইডি আছে এবং আইডি হিসাবে এর অর্থ লেবেলের নামটি ব্যবহার করছেন না, আপনি অর্থের জন্য সদৃশ নামগুলিকে অনুমতি দিতে পারবেন এবং দুটি নগদ এন্ট্রি অন্তর্ভুক্ত করতে পারেন, উদাহরণস্বরূপ:

ইউআইডি, লেবেল, ইস্রাফুন্ড

1, নগদ, মিথ্যা

2, নগদ, সত্য

3, ভাউচার, মিথ্যা

4, ভাউচার, সত্য

তারপরে আপনি সহজেই নিম্নলিখিতগুলি পেতে পারেন:

লেনদেনের ধরণ = MoneyTransferMean.IsRefund? "ফেরত": "অর্থ প্রদান"

লেনদেনের মান = MoneyTransferMean.IsRefund? মানি ট্রান্সফার.অ্যামাউন্ট * -1: মানি ট্রান্সফার.অ্যামাউন্ট

এইভাবে, যদি আপনার লেনদেনগুলিতে আপনি MoneyTransferMean.UID = 2 কে রেফারেন্স করেছেন তবে আপনি জানেন যে এটি কোনও নগদ অর্থ ফেরত বা নগদ অর্থ প্রদানের পরিমাণ হতে পারে transaction


আহ ব্যাগার, সবেমাত্র লক্ষ্য করেছেন আপনি বলেছিলেন যে আপনি পাবলিক এপিআই সম্পাদনা / সম্পাদনা করতে চান না। দুঃখিত / আমার উত্তরটিকে অগ্রাহ্য করুন, যদিও আমি এটিকে সম্ভবত রেখে দেব কারণ এটি একই ধরণের সমস্যা / ব্যবহারের ক্ষেত্রে অন্যদের জন্য কার্যকর।
FrugalTPH

0

অবশেষে, আমি আমার সত্তা অনুরূপ দ্বারা সমস্যা সমাধানের জন্য সিদ্ধান্ত নিয়েছে MoneyTransferMeanদুই সত্ত্বা মধ্যে PaymentMeanএবং RefundMean

বাস্তবায়নের ক্ষেত্রে একই রকম হলেও, দুটি সত্তার মধ্যে পার্থক্য ব্যবসায়টি উপলব্ধি করে এবং এটি আমার পক্ষে সবচেয়ে নিকৃষ্টতম সমাধান ছিল।

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