এমভিভিএম ডাব্লুপিএফ-এ ভিউমোডেলের সত্তা ফ্রেমওয়ার্ক ডাটাবেস কনটেক্সট (মডেল) ওয়্যার আপ করার সর্বোত্তম উপায় কী?


9

উপরের প্রশ্নে যেমন: এমভিভিএম (ডাব্লুপিএফ) তে মডেলটি দেখার জন্য এন্টি ফ্রেমওয়ার্ক ডাটাবেস মডেল (প্রসঙ্গ) তারের সর্বোত্তম উপায় কী?

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

উত্তরের জন্য ধন্যবাদ।

//ctor of ViewModel 
public ViewModel()
{ 
db = new PackageShipmentDBEntities(); // Entity Framework generated class

ListaZBazy = new ObservableCollection<Pack>(db.Packs.Where(w => w.IsSent == false)); 
}

এটি ভিউমোডেলের আমার সাধারণ কর্টোর, মনে করুন এর থেকে আরও ভাল উপায় আছে, আমি সংগ্রহস্থলের প্যাটার্ন সম্পর্কে পড়ছিলাম, নিশ্চিত না যে আমি এটি ডাব্লুপিএফ এমভিভিএমের সাথে মানিয়ে নিতে পারি কিনা

উত্তর:


4

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

অতীতে আমি এই সমাধানটি ব্যবহার করেছি যা রেপো নিদর্শনগুলির অনেকের চেয়ে অনেক সহজ আমি দেখেছি যে জিনিসগুলিকে একটি চূড়ান্ত পরিমাণে বিমূর্ত করার চেষ্টা করা হয়েছিল যার ফলে ডিবাগ করা শক্ত near পদক্ষেপ এখানে ...

  1. আপনার ডেটা অ্যাক্সেস স্তর হিসাবে কাজ করার জন্য ইডিএমএক্সের জন্য একটি পৃথক প্রকল্প তৈরি করুন
  2. একই প্রকল্পের আওতায় একটি "সংগ্রহস্থল" ফোল্ডার তৈরি করুন
  3. "কাজের একক" হিসাবে কাজ করতে একটি বেস ক্লাস "বেসরেপোসিটিরি" তৈরি করুন। IDisposableএটি আপনাকে একটিতে ব্যবহার করার অনুমতি দেবে using(){}এবং partialঅনুমতি দেয় আপনি অন্যান্য সংগ্রহস্থলগুলি প্রয়োগ করতে পারবেন

    public partial class MyEntityRepository : IDisposable
    {
        MyEntities context = new MyEntities();
    
        public void Dispose()
        {
            context.Dispose();
        }
    }
  4. "মাইওথেররোপোসিটরি" নামে একটি ফাইল তৈরি করুন। একই আংশিক বর্গ তৈরি করুন তবে আপনি যে ফাইলটি ধারণ করতে চান তার উপর ভিত্তি করে পদ্ধতিগুলি প্রয়োগ করুন

    public partial class MyEntityRepository
    {
        public void MyOtherMethodSave(EntityObject obj)
        {
            //work with context
            ...
    
            context.SaveChanges();
        }
    }

এখন আপনার ভিএম এ আপনি এটি করতে পারেন ...

using(MyEntityRepository repo = new MyEntityRepository())
{
     repo.MyOtherMethodSave(objectToSave);
}

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

অসুবিধাটি হ'ল বৃহত্তর সিস্টেমগুলির সাথে আপনার অনেকগুলি পদ্ধতি থাকতে পারে যা আপনার রেপোর নীচে বান্ডিল হয়ে যায়। এক্ষেত্রে একটি সমাধান হ'ল "ফাইন্ড" বা "অ্যাড" এর মতো কিছু বেসিক সাধারণ কমান্ড প্রয়োগ করা এবং তাদের নিজ নিজ ভান্ডারে বিশেষায়িত প্রয়োগ করা।


2
আপনি 'MyEntityRepository' EF এর নিজস্ব প্রসঙ্গ প্রতিস্থাপন করতে পারেন এবং আপনি একই ফলাফল পাবেন। যদি না আপনি EF এর প্রসঙ্গটি আপনার নিজের "সংগ্রহস্থল" দিয়ে মোড়াতে চান, ডুপ্লিকেশন বৃদ্ধি করে।
ইউফোরিক

@ ইউফোরিক হ্যাঁ আপনি করতে পারেন, তবে তারপরেও আপনি গ্যারান্টিযুক্ত হবেন না যে ভান্ডারটি প্রসঙ্গে ব্যবহার করা হয়েছে। পুরো বিষয়টি হ'ল ইএফ সহজ ব্যবসায়ের প্রয়োজনীয়তার সাথে কাজ করে
জুতো

4

ভান্ডারগুলির বিরোধিতা, যা আমি পছন্দ করি না। আমি কমান্ড প্যাটার্নটি ব্যবহার করার পরামর্শ দেব, যেমন আয়েন্দে প্রস্তাবিত ।

সহজভাবে বলেছিলেন, প্রতিটি অপারেশনের জন্য, আপনি একটি পৃথক ThisOperationCommandশ্রেণি তৈরি করেন । এই শ্রেণীর অভ্যন্তরে আপনি সাধারণ EF প্রসঙ্গে কাজ করবেন। আপনি এমনকি কিছু বেস ক্লাস ব্যবহার করতে পারেন EFCommandযা আপনার জন্য কিছু নদীর গভীরতানির্ণয় করে।

ভিউমোডেল দিক থেকে, আপনি এই কমান্ডটির উদাহরণ তৈরি করেন, এটি পরামিতিগুলি পূরণ করুন (আপনি যদি কমান্ড এবং ভিউমোডেলের মধ্যে দৃ tight় সংযোগ স্থাপন করতে আপত্তি করেন না তবে আপনি পুরো ভিউমোডেল উদাহরণটিও দিতে পারেন) এবং পরে এটি কোনও Executeপদ্ধতিতে পাস করুন, এটি শুরু হবে will কমান্ড আপ করুন, এটি সম্পাদন করুন, এটি ছিঁড়ে ফেলুন এবং তারপরে যা আদেশ পেয়েছিল তা ফিরিয়ে দিন। এক্সিকিউশনের পরে কমান্ডের উদাহরণ থেকে পেয়ে গেলে এটি একাধিক মানও ফিরিয়ে আনতে পারে।

সুবিধাটি হ'ল আপনার रिपোটোটারি হিসাবে পুরো ডেটা অ্যাক্সেস লেয়ারটিকে নকল করার দরকার নেই এবং আপনি যতক্ষণ না এর সমর্থনের জন্য কিছু সাধারণ অবকাঠামো তৈরি করেন ততক্ষণ আপনি আদেশগুলি পুনরায় ব্যবহার ও রচনা করতে পারবেন। উদাহরণস্বরূপ, অন্যান্য কমান্ডগুলি থেকে আদেশগুলি কার্যকর করা।


0

সাধারণ দৃশ্যের জন্য আমি নিম্নলিখিতগুলি ব্যবহার করেছি:

public class ViewModel : IDisposable {

    private EntitiesContext _context = new EntitiesContext();

    private SomeEntity _model;
    public SomeEntity Model {
       get { return _model; }
    }

    public View(int id) {
        _model = _context.SomeEntity.Find(id);
    }

    private ICommand _saveCommand = new RelayCommand(() => _context.SaveChanges());
    public ICommand SaveCommand {
        get { return _saveCommand; }
    }        

    public void Dispose() {
         _context.Dispose();
    }

}

1
এটির সাথে সমস্যা হ'ল আপনার প্রসঙ্গটি এখন সম্ভাব্য "দীর্ঘজীবী"।
জুতো

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