ভিউমোডেলকোটর কী এবং ডেটা টেম্পলেটগুলির তুলনায় এর উপকারগুলি / কনসগুলি কী কী?


112

কেউ আমাকে ভিউমোডেলকোটার কী, কীভাবে এটি কাজ করে এবং ডেটা টেম্পলেটগুলির তুলনায় এটি ব্যবহার করার পক্ষে কী কী উপকারিতা / কনসগুলির একটি দ্রুত সংক্ষিপ্তসার দিতে পারে?

আমি গুগলে তথ্য সন্ধান করার চেষ্টা করেছি কিন্তু এটির অনেকগুলি বাস্তবায়ন রয়েছে এবং এটি কী এবং এটি ব্যবহারের পক্ষে / কৌশলগুলি সম্পর্কে কোনও স্ট্রাইগট তালিকা নেই।

উত্তর:


204

ইন্ট্রো

এমভিভিএম-এ স্বাভাবিক অনুশীলন হ'ল নির্ভরতা ইঞ্জেকশন (ডিআই) ধারক থেকে সমাধান করে ভিউগুলি তাদের ভিউমোডেলগুলি সন্ধান করে । কনটেইনারটি ভিউ ক্লাসের কোনও উদাহরণ সরবরাহ (সমাধান) করতে বললে এটি স্বয়ংক্রিয়ভাবে ঘটে। ধারক উদ্বুদ্ধ দৃশ্যে ViewModel দেখুন যা ViewModel পরামিতি গ্রহণ করে একটি কন্সট্রাকটর কল করে; এই স্কিমটিকে ইনভার্শন অফ কন্ট্রোল (আইওসি) বলা হয়।

ডিআই এর সুবিধা

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

ডিআই থেকে উদ্ভূত সমস্যা

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

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

তবে ডিজাইনের সময়টিতে আমাদের চলার কোনও কোড নেই । ডিজাইনার আমাদের দর্শনগুলির উদাহরণগুলি তৈরি করতে প্রতিবিম্বটি ব্যবহার করার চেষ্টা করে যার অর্থ:

  • যদি ভিউ কনস্ট্রাক্টরের একটি ভিউমোডেল উদাহরণের প্রয়োজন হয় তবে ডিজাইনার এ দৃশ্যটি মোটেও ইনস্ট্যান্ট করতে পারবেন না - এটি কিছু নিয়ন্ত্রিত পদ্ধতিতে ত্রুটি থেকে বেরিয়ে আসবে will
  • যদি ভিউটিতে একটি প্যারামিটারহীন নির্মাতা থাকে তবে ভিউটি তাত্ক্ষণিকভাবে চালু করা হবে তবে এটি DataContextহবে nullতাই আমরা ডিজাইনারটিতে একটি "খালি" ভিউ পেয়ে যাব - যা খুব কার্যকর নয় is

ভিউমোডেলকোটার প্রবেশ করান

ভিউমোডেললোকেটর এটির মতো ব্যবহৃত অতিরিক্ত বিমূর্ততা:

  • ভিউ নিজেই তার সংস্থাগুলির অংশ হিসাবে একটি ভিউমোডেললোকেটর ইনস্ট্যান্ট করে এবং এটির ডেটাবন্টেক্সটি লোকেটারের ভিউমোডেল বৈশিষ্ট্যের সাথে সংযুক্ত করে
  • আমরা ডিজাইন মোডে থাকা অবস্থায় কোনওভাবে সনাক্তকারী সনাক্ত করে dete
  • যদি নকশা মোডে না থাকে তবে লোকেটার একটি ভিউমোডেল দেয় যা এটি ডিআই কনটেইনার থেকে সমাধান হয়েছে, উপরে বর্ণিত হিসাবে
  • যদি ডিজাইনের মোডে থাকে তবে লোকেটার তার নিজস্ব যুক্তি ব্যবহার করে একটি নির্দিষ্ট "ডামি" ভিউমোডেল ফিরিয়ে দেয় (মনে রাখবেন: ডিজাইনের সময় কোনও ধারক নেই!); এই ভিউমোডেলটি সাধারণত ডামি ডেটা সহ প্রিপোপুলেটেড আসে

অবশ্যই এর অর্থ হ'ল ভিউটির সাথে শুরু করতে প্যারামিটারলেস কনস্ট্রাক্টর থাকতে হবে (অন্যথায় ডিজাইনার এটি ইনস্ট্যান্ট করতে সক্ষম হবে না)।

সারসংক্ষেপ

ভিউমোডেলকোয়েটার হ'ল একটি প্রতিমা যা আপনাকে আপনার এমভিভিএম অ্যাপ্লিকেশনটিতে ডিআই-র সুবিধাগুলি রাখতে দেয় এবং ভিজ্যুয়াল ডিজাইনারদের সাথে আপনার কোডটি ভাল খেলতে দেয়। এটিকে কখনও কখনও আপনার অ্যাপ্লিকেশনটির "ব্লেন্ডাবিলিটি" বলা হয় (এক্সপ্রেশন ব্লেন্ডের উল্লেখ করে)।

উপরের হজম করার পরে, এখানে একটি বাস্তব উদাহরণ দেখুন ।

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


4
একটি দুর্দান্ত ব্যাখ্যার জন্য +1। আপনি ভিউ এবং এর সংস্থানগুলিতে আরও প্রসারিত করতে পারেন? সংস্থানগুলি দ্বারা, আপনি কি ভিউয়ের বৈশিষ্ট্যগুলি বোঝাতে চান? না? এই প্যাটার্নটির সাথে আপনার কোনও কংক্রিটের উদাহরণ রয়েছে?
মেট্রো স্মুরফ

@ মেট্রোস্মার্ফ: আপনার লিঙ্কটি সংক্ষিপ্ত বিভাগে।
জন

1
ধন্যবাদ। ভিউমোডেলকোটার ব্যবহারের কি কোনও সীমাবদ্ধতা রয়েছে? এটি একটি স্থিতিশীল সংস্থানটির উল্লেখ হিসাবে আমার কিছু উদ্বেগ ছিল - ভিউমোডেলগুলি রানটাইম সময়ে গতিশীলভাবে তৈরি করা যায়? এবং একাধিক সংকেতকে জড়িত করার জন্য অতিরিক্ত কোড রয়েছে?
রাহেল

@ রাচেল: সংক্ষেপে একই লিঙ্কটির ব্যবহারিক উদাহরণ দিয়ে এই প্রশ্নের উত্তর দেওয়া উচিত।
জন

2
চরম বিভ্রান্তিকর উত্তর। ভিউ মডেল লোকেটারের প্রাথমিক উদ্দেশ্যটি ডিজাইনারের কাছে ডামি ডেটা সরবরাহ করা নয়। আপনি উল্লেখ করে সহজেই এটি করতে পারেন d:DataContext="{d:DesignInstance MockViewModels:MockMainWindowModel, IsDesignTimeCreatable=True}"। লোকেটারের উদ্দেশ্য হ'ল ভিউগুলিতে ডিআই সক্ষম করা, কারণ ডাব্লুপিএফ এটি সরবরাহ করাতে খুব খারাপ। উদাহরণ: আপনার একটি প্রধান উইন্ডো রয়েছে যা কিছু ডায়ালগ উইন্ডো খোলায়। ডায়ালগ উইন্ডোতে ডিআই-কে স্বাভাবিক উপায়ে সমাধান করার জন্য আপনাকে এটিকে মূল উইন্ডোর উপর নির্ভরতা হিসাবে পাস করতে হবে! এটি ভিউ লোকেটার দিয়ে এড়ানো যায়।
হায়ানকভ

10

@ জনের উত্তরের একটি উদাহরণ বাস্তবায়ন

আমার একটি ভিউ মডেল লোকেটার ক্লাস রয়েছে। প্রতিটি সম্পত্তি ভিউ মডেলের একটি উদাহরণ হতে চলেছে যা আমি আমার ভিউতে বরাদ্দ করতে যাচ্ছি। কোডটি ডিজাইন মোডে চলছে কিনা বা ব্যবহার হচ্ছে না তা আমি পরীক্ষা করতে পারি DesignerProperties.GetIsInDesignMode। এটি যখন আমি অ্যাপ্লিকেশনটি চালাচ্ছি তখন ডিজাইনের সময় এবং আসল অবজেক্টটির সময় আমাকে একটি মক মডেল ব্যবহার করতে দেয়।

public class ViewModelLocator
{
    private DependencyObject dummy = new DependencyObject();

    public IMainViewModel MainViewModel
    {
        get
        {
            if (IsInDesignMode())
            {
                return new MockMainViewModel();
            }

            return MyIoC.Container.GetExportedValue<IMainViewModel>();
        }
    }

    // returns true if editing .xaml file in VS for example
    private bool IsInDesignMode()
    {
        return DesignerProperties.GetIsInDesignMode(dummy);
    }
}

এবং এটি ব্যবহার করতে আমি আমার লোকেটারকে App.xamlসংস্থানগুলিতে যুক্ত করতে পারি :

xmlns:core="clr-namespace:MyViewModelLocatorNamespace"

<Application.Resources>
    <core:ViewModelLocator x:Key="ViewModelLocator" />
</Application.Resources>

এবং তারপরে আপনার ভিউ মডেলটিতে আপনার দর্শনটি (যেমন: মেইনভিউ.অ্যাক্যামেল) তারে যুক্ত করতে:

<Window ...
  DataContext="{Binding Path=MainViewModel, Source={StaticResource ViewModelLocator}}">

thisপরিবর্তে ব্যবহারে কোনও পার্থক্য আছে dummy?
সেবাস্তিয়ান জাওরি ওয়াইনিওইইকি

5

আমি বুঝতে পারি না কেন এই প্রশ্নের অন্যান্য উত্তরগুলি ডিজাইনারের চারপাশে মোড়ক করে।

ভিউ মডেল লোকেটারের উদ্দেশ্য হ'ল আপনার ভিউটিকে এটি ইনস্ট্যান্ট করার অনুমতি দেওয়া (হ্যাঁ, মডেল লোকেটার দেখুন = প্রথম দেখুন):

public void MyWindowViewModel(IService someService)
{
}

পরিবর্তে কেবল এই:

public void MyWindowViewModel()
{
}

এটি ঘোষণা করে:

DataContext="{Binding MainWindowModel, Source={StaticResource ViewModelLocator}}"

ViewModelLocatorক্লাসটি কোথায় , যা একটি আইওসি রেফারেন্স করে এবং এটি কীভাবে MainWindowModelএটি প্রকাশ করে সেই সম্পত্তিটি সমাধান করে ।

আপনার দৃষ্টিতে মক ভিউ মডেল সরবরাহ করার সাথে এর কোনও যোগসূত্র নেই। আপনি যদি এটি চান, ঠিক না

d:DataContext="{d:DesignInstance MockViewModels:MockMainWindowModel, IsDesignTimeCreatable=True}"

ভিউ মডেল লোকেটার হ'ল নিয়ন্ত্রণের ধারক হিসাবে কিছু (যে কোনও) বিপরীতমুখী যেমন একটি ইউনিটির উদাহরণস্বরূপ around

নির্দেশ করে:


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

আপনি ঠিক বলেছেন যখন " আমি উত্তর বুঝতে পারি না কেন অন্য উত্তরগুলি [...] ডিজাইনারের চারপাশে কেন জড়িয়ে রাখে " +1, তবে লোকেশনটির বিন্দুটি ভিউ মডেলটি কেমন তা সম্পর্কে কোনও জ্ঞান ভিউ থেকে সরিয়ে ফেলতে হবে তৈরি করা হয়েছে, ভিউকে এই তাত্ক্ষণিক থেকে স্বাধীন করে তোলে যা লোকেটারে রেখে যায়। লোকেটর ভিউ মডেলটির বিভিন্ন স্বাদ সরবরাহ করতে সক্ষম হবে, সম্ভবত কিছু কাস্টম যুক্ত প্লাগইনগুলির সাহায্যে লোকেটার পরিচালনা করবে (এবং ডিজাইনের সময়ের জন্য একটি নির্দিষ্ট)। ভিউ মডেলটির সঠিক সংস্করণ সনাক্তকরণের এই প্রক্রিয়াটির যে কোনও একটি থেকে পরিষ্কার হবে, এটি এসসির পক্ষে সত্যই ভাল।
মিনিট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.