আমার কি ডোমেন অবজেক্টে ভান্ডার ব্যবহার করা উচিত বা ডোমেন অবজেক্টটি পরিষেবা স্তরটিতে ফিরে যেতে হবে?


10

আমি একটি লেনদেনের স্ক্রিপ্ট বিশ্ব থেকে এসেছি এবং আমি সবে ডিডিডি একবার দেখতে শুরু করছি। ডেটাবেস অধ্যবসায়ের সাথে ডিডিডি ডিজাইনকে সংহত করার সঠিক উপায় সম্পর্কে আমি অনিশ্চিত। এটি আমার কাছে রয়েছে:

অর্গানাইজেশন সার্ভিস নামে একটি পরিষেবা শ্রেণি যার ইন্টারফেসে সংস্থাপনের ডোমেন অবজেক্টগুলির দৃষ্টান্তগুলি পুনরুদ্ধার এবং সংরক্ষণের জন্য পদ্ধতি রয়েছে। সংগঠন একটি সামগ্রিক মূল এবং এর সাথে সম্পর্কিত অন্যান্য ডেটা রয়েছে: সদস্য এবং লাইসেন্স। EF6 ডাটাবেস প্রথম DBContext সংগঠনসেবা মধ্যে সংগঠনডিবি সত্তা এবং সম্পর্কিত সদস্যডিবি এবং লাইসেন্সডিবি সত্তা পুনরুদ্ধার করতে ব্যবহৃত হয়। অর্গানাইজেশন সার্ভিসেস দ্বারা পুনরুদ্ধার করা এবং সংস্থার ডোমেন অবজেক্টে লোড করার পরে এগুলি সমস্ত তাদের ডোমেন অবজেক্ট শ্রেণির সমতুল্যে রূপান্তরিত হয়। এই অবজেক্টটি দেখতে এমন দেখাচ্ছে:

public class Organisation
{
    public IList<Member> Members { get; set; }
    public IList<License> Licenses { get; set; }
}

আমি সংস্থাপনার পরিষেবাতে রিপোজিটরি প্যাটার্নটি ব্যবহার করছি না ... আমি EF নিজেই সংগ্রহস্থল হিসাবে ব্যবহার করছি কারণ মনে হচ্ছে EF6 এখন বেশিরভাগই সংগ্রহস্থলকে অপ্রয়োজনীয় করে তুলেছে।

নকশার এই মুহুর্তে সংস্থার ডোমেন অবজেক্টটি রক্তশূন্য: এটি EF পোকো অর্গানাইজেশন শ্রেণির মতো দেখায়। অর্গানাইজেশন সার্ভিস ক্লাসটি দেখতে অনেকটা একটি সংগ্রহস্থলের মতো!

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

এখানেই আমার কী করা উচিত তা সম্পর্কে আমি অনিশ্চিত: যুক্তির অংশ হিসাবে আমার এই তথ্যটি ডাটাবেসে ফিরিয়ে রাখতে হবে। এর অর্থ কি এটি করার জন্য আমার কাছে অর্গানাইজেশন ডোমেনের মধ্যে DbContext ব্যবহার করা উচিত? ডোমেন অবজেক্টের মধ্যে কী ভান্ডার / ইএফ ব্যবহার করা খারাপ অভ্যাস? যদি তা হয় তবে এই অধ্যবসায়ের বিষয়টি কোথায়?

public class Organisation
{
    public IList<Member> Members { get; set; }
    public IList<License> Licenses { get; set; }

    public void AddLicensesToOrganisation(IList<License> licensesToAdd)
    {
        // Do validation/other stuff/

        // And now Save to the DB???
        using(var context = new EFContext())
        {
            context.Licenses.Add(...
        }

        // Add to the Licenses collection in Memory
        Licenses.AddRange(licensesToAdd);
    }
}

এর পরিবর্তে আমি কি কেবল সংগঠনের ডোমেন অবজেক্টটিকে মেমরির মধ্যে পরিবর্তন করতে এবং তারপরে অধ্যবসায়ের জন্য এটি সংস্থাপনসেবাতে ফিরিয়ে দিচ্ছি? তারপরে আমাকে অবজেক্টে আসলে কী বদলেছে তা ট্র্যাক করতে হবে (এটি যা ইএফ নিজস্ব পোকোগুলিতে করে! আমি এই ধরনের অনুভব করতে এসেছি যে EF কেবল একটি সংগ্রহস্থল প্রতিস্থাপন নয়, তবে এটি ডোমেন স্তরও হতে পারে!)

এখানে যে কোনও গাইডেন্স প্রশংসিত হয়।

উত্তর:


2

আপনি উভয় পদ্ধতির গ্রহণ করতে পারেন এবং এটি ভালভাবে কাজ করতে পারেন - অবশ্যই আছে, ভাল এবং কুফল।

সত্তা ফ্রেমওয়ার্ক অবশ্যই আপনার ডোমেন সত্তা হ্রাস করার উদ্দেশ্যে করা হয়। আপনার ডোমেন সত্তা এবং ডেটা সত্ত্বাগুলি যখন একই ক্লাস হয় তখন এটি ভাল কাজ করে। আপনি যদি আপনার জন্য পরিবর্তনের উপর নজর রাখতে EF এ নির্ভর করতে পারেন এবং context.SaveChanges()আপনার লেনদেনের কাজটি শেষ করেন কেবল তখনই কল করুন It's এর অর্থ হ'ল আপনার বৈধতা বৈশিষ্ট্যগুলি একবার আপনার ডোমেন মডেলগুলিতে এবং একবারে আপনার অস্তিত্ব নিয়ে একবার স্থাপন করতে হবে না - আপনার ব্যবসায়িক যুক্তিতে এই জাতীয় জিনিসগুলি যাচাই [Required]বা [StringLength(x)]চেক করা যেতে পারে , যা করার চেষ্টা করার আগে আপনাকে অবৈধ ডেটা স্টেটগুলি ধরতে দেয় একটি ডিবি লেনদেন করুন এবং একটি পেতেEntityValidationException। শেষ পর্যন্ত, এটি কোডে তাত্ক্ষণিক - আপনার কোনও ম্যাপিং স্তর বা সংগ্রহশালা লেখার দরকার নেই, তবে পরিবর্তে EF প্রসঙ্গে সরাসরি কাজ করতে পারেন। এটি ইতিমধ্যে একটি ভাণ্ডার এবং কাজের একক, সুতরাং বিমূর্তির অতিরিক্ত স্তরগুলি কোনও কিছুই সম্পাদন করে না।

আপনার ডোমেন এবং অস্থায়ী সংস্থাগুলির সংমিশ্রণের একটি সর্বনিম্ন দিকটি হ'ল আপনি নিজের [NotMapped]বৈশিষ্ট্যগুলিতে ছড়িয়ে ছিটিয়ে থাকা গুচ্ছের গুচ্ছ দিয়ে শেষ করুন । প্রায়শই, আপনি ডোমেন-সুনির্দিষ্ট বৈশিষ্ট্যগুলি চাইবেন যা হয় হয় কেবলমাত্র স্থায়ী ডেটাতে কেবলমাত্র ফিল্টার হয় অথবা আপনার ব্যবসায়িক যুক্তিতে পরে সেট করা থাকে এবং আপনার ডেটাবেজে ফিরে থাকে না। কিছু সময়, আপনি আপনার ডোমেন মডেলগুলিতে এমন একটি উপায়ে আপনার ডেটা প্রকাশ করতে চান যা কোনও ডাটাবেসের সাথে খুব ভাল কাজ করে না - উদাহরণস্বরূপ, এনামগুলি ব্যবহার করার সময় সত্তা এটিকে একটি intকলামে মানচিত্র করবে - তবে সম্ভবত আপনি মানচিত্র করতে চান এগুলি একটি মানব-পঠনযোগ্য string, যাতে আপনার ডাটাবেস পরীক্ষা করার সময় কোনও অনুসন্ধানের প্রয়োজন হয় না। তারপরে আপনি stringম্যাপ করা একটি সম্পত্তি দিয়ে শেষ করুন , এenumসম্পত্তি নয় যা (তবে এনামগুলিতে স্ট্রিং এবং মানচিত্র পায়), এবং একটি API যা উভয়ই প্রকাশ করে! একইভাবে, আপনি যদি mappedপ্রসঙ্গত জুড়ে জটিল ধরণের (টেবিলগুলি) একত্রিত করতে চান তবে আপনি একটি অন্যান্য টেবিলআইডি এবং একটি আনম্যাপড ComplexTypeসম্পত্তি দিয়ে সজ্জিত করতে পারেন , যা উভয়ই আপনার শ্রেণিতে প্রকাশ্য হিসাবে প্রকাশিত হয়েছে। এটি এমন কারও জন্য বিভ্রান্তিকর হতে পারে যা এই প্রকল্পের সাথে পরিচিত নয় এবং অকারণে আপনার ডোমেন মডেলগুলিকে ব্লাট করে।

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

আপনার সত্তা পরিবর্তনগুলি ম্যানুয়ালি ট্র্যাকিংয়ের ঝামেলা এড়ানোর একটি কৌশল হ'ল আপনার ডোমেন মডেলটিতে সংশ্লিষ্ট স্থায়ী সত্তা আইডি সংরক্ষণ করা। এটি আপনার ম্যাপিং স্তর দ্বারা স্বয়ংক্রিয়ভাবে পূরণ করা যেতে পারে। তারপরে, যখন আপনাকে ইএফ-এ ফিরে আসা পরিবর্তন পরিবর্তন করতে হবে, কোনও ম্যাপিংয়ের আগে প্রাসঙ্গিক অবিচ্ছিন্ন সত্তাটি পুনরুদ্ধার করুন । তারপরে আপনি যখন পরিবর্তনগুলি মানচিত্র করবেন, তখন EF এগুলিকে স্বয়ংক্রিয়ভাবে সনাক্ত করবে এবং আপনি context.SaveChanges()সেগুলি হাতে না পেয়ে কল করতে পারবেন ।

public class OrganisationService
{
    public void PersistLicenses(IList<DomainLicenses> licenses) 
    {
        using (var context = new EFContext()) 
        {
            foreach (DomainLicense license in licenses) 
            {
                var persistedLicense = context.Licenses.Find(pl => pl.Id == license.PersistedId);
                MappingService.Map(persistedLicense, license); //Right-left mapping
                context.Update(persistedLicense);
            }
            context.SaveChanges();
        }
    }
}

বিভিন্ন জটিলতার সাথে ডেটার বিভিন্ন জটিলতার সাথে একত্রিত হওয়ার সময় কি কোনও সমস্যা আছে? আপনার যদি ডিবি-তে খুব সুন্দরভাবে মানচিত্রের কিছু থাকে তবে সরাসরি EF ব্যবহার করুন। আপনার যদি এমন কিছু থাকে যা না থাকে তবে EF ব্যবহারের আগে একটি ম্যাপিং / বিমূর্তি প্রবর্তন করুন।
ইউফোরিক

@ মেকিংয়ে ডোমেন এবং ডিবি-র পার্থক্যগুলিকে পরিচালনা করা যেতে পারে। আমি এমন কোনও ব্যবহারের ক্ষেত্রে ভাবতে পারি না যেখানে দু'বার ডোমেন যুক্ত করা (অবিচল এবং অবিচল থাকা) এবং হ্যান্ডেল চেঞ্জ ট্র্যাকিং হ্যান্ডেল করা বিশেষ ক্ষেত্রে ম্যাপিং যুক্ত করার চেয়ে কম কাজ। আপনি কি আমাকে একটিতে ইঙ্গিত করতে পারেন? (আমি এনহাইবারনেট ব্যবহার করে ধরে নিলাম, সম্ভবত ইএফ আরও সীমাবদ্ধ?)
ফিরো

অত্যন্ত সহায়ক, ব্যবহারিক এবং তথ্যমূলক উত্তর। উত্তর হিসাবে চিহ্নিত করা হচ্ছে। ধন্যবাদ!
মিঃ লেন

3

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

public void AddLicenses(IEnumerable<License> licensesToAdd)
{
    // Do validation/other stuff/
    // Add to the Licenses collection in Memory
    Licenses.AddRange(licensesToAdd);
}

এবং চারপাশে কোড

var someOrg = Load(orgId);

someOrg.AddLicenses(someLicences);

SaveChanges();

আমার ডোমেন অবজেক্টগুলি সত্তা নয়, সুতরাং লাইসেন্স সংগ্রহগুলিতে এগুলি যুক্ত করা, যা কেবল একটি তালিকা এটি কাটবে না। প্রশ্নটি EF সম্পর্কে এতটা নয় যদিও এটি যেখানে আসল অধ্যবসায় ঘটে takes EF- তে সমস্ত অধ্যবসায় অবশ্যই একটি প্রসঙ্গে সুযোগের মধ্যে থাকা উচিত। প্রশ্নটি এটার অন্তর্ভুক্ত কোথায়?
মিঃ লেন

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