রানটাইমটিতে ভিউ মডেলগুলি কীভাবে তৈরি করা যায় তা কম বেদনাদায়ক


17

দীর্ঘ প্রশ্নের জন্য আমি ক্ষমাপ্রার্থনা করি, এটি কিছুটা ভাড়া বলে কিছুটা পড়ে, কিন্তু আমি প্রতিশ্রুতি দিচ্ছি না! আমি নীচে আমার প্রশ্ন (গুলি) সংক্ষিপ্ত করেছি

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

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

যখনই আপনি instantiate প্রয়োজন ProductDetailsViewModelথেকে ProductSearchViewModel(যার থেকে আপনি নামক ProductSearchWebServiceঘুরে ফিরে যা IEnumerable<ProductDTO>, আপনি এই জিনিস এক করতে পারি? আমার সাথে এখনও সবাই):

  • কল করুন new ProductDetailsViewModel(productDTO, _shoppingCartWebService /* dependcy */);, এটি খারাপ, আরও ৩ টি নির্ভরতা কল্পনা করুন, এর অর্থ ProductSearchViewModelসেই depend নির্ভরতাগুলিও গ্রহণ করা দরকার। কনস্ট্রাক্টর পরিবর্তন করাও বেদনাদায়ক।
  • কল করুন _myInjectedProductDetailsViewModelFactory.Create().Initialize(productDTO);, কারখানাটি কেবল একটি ফানক, এগুলি বেশিরভাগ আইওসি ফ্রেমওয়ার্ক দ্বারা সহজেই উত্পাদিত হয়। আমি এটি খারাপ বলে মনে করি কারণ ইনটি পদ্ধতিগুলি একটি ফাঁস বিমূর্ততা। আপনি দীক্ষা পদ্ধতিতে সেট করা ক্ষেত্রগুলির জন্য পঠনযোগ্য কীওয়ার্ডটিও ব্যবহার করতে পারবেন না। আমি নিশ্চিত যে আরও কয়েকটি কারণ রয়েছে।
  • কল _myInjectedProductDetailsViewModelAbstractFactory.Create(productDTO);তাই ... এটি হ'ল ধাঁচের (বিমূর্ত কারখানা) যা সাধারণত এই ধরণের সমস্যার জন্য সুপারিশ করা হয়। আমি যদিও এটি প্রতিভা ছিলাম যেহেতু এটি স্থির টাইপিংয়ের জন্য আমার তুচ্ছতাকে সন্তুষ্ট করে, যতক্ষণ না আমি আসলে এটি ব্যবহার শুরু করি। বয়লারপ্লেট কোডের পরিমাণটি আমি খুব বেশি ভাবি (আপনি জানেন, আমি যে হাস্যকর পরিবর্তনশীল নামগুলি ব্যবহার করি তা বাদ দিয়ে)। প্রতিটি ভিউমোডেলের জন্য যা রানটাইম প্যারামিটারগুলির প্রয়োজন তার জন্য আপনি দুটি অতিরিক্ত ফাইল (ফ্যাক্টরি ইন্টারফেস এবং বাস্তবায়ন) পাবেন এবং আপনাকে 4 অতিরিক্ত বারের মতো রান-টাইম নির্ভরতা টাইপ করতে হবে। এবং প্রতিটি সময় নির্ভরতা পরিবর্তিত হয়, আপনি এটি কারখানায়ও পরিবর্তন করতে পারবেন। দেখে মনে হচ্ছে আমি আর ডিআই কনটেইনার ব্যবহার করি না। (আমি মনে করি ক্যাসেল উইন্ডসর এর এর জন্য এক ধরণের সমাধান রয়েছে [এর নিজস্ব ত্রুটিগুলি নিয়ে, আমি ভুল হলে আমাকে সংশোধন করব]))।
  • বেনামে টাইপ বা অভিধান দিয়ে কিছু করুন। আমি আমার স্ট্যাটিক টাইপিং পছন্দ করি।

তাই হ্যা. রাষ্ট্র এবং আচরণকে এইভাবে মিশ্রিত করে এমন একটি সমস্যা তৈরি করে যা এমভিসিতে মোটেই বিদ্যমান নয়। এবং আমি মনে করি যে এই সমস্যাটির জন্য বর্তমানে কোনও যথাযথ সমাধান নেই। এখন আমি কিছু জিনিস পর্যবেক্ষণ করতে চাই:

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

সংক্ষেপ

  • আমি কি এই সিদ্ধান্তে পৌঁছতে পারি যে ভিউমোডেল রাষ্ট্র এবং আচরণ উভয়ের জন্যই একীকরণের বিন্দু হ'ল সামগ্রিকভাবে এমভিভিএম প্যাটার্নের সাথে কিছু অসুবিধার কারণ?
  • স্থিতিশীলভাবে কোনও ভিউমোডেল ইনস্ট্যান্ট করার জন্য কি অ্যাবস্ট্রাক্ট ফ্যাক্টরি প্যাটার্নটি একমাত্র / সর্বোত্তম উপায়?
  • গভীরতার রেফারেন্স বাস্তবায়নের মতো কিছু আছে কি?
  • উভয় স্টেট / আচরণের সাথে ভিউমোডেলগুলি কী কোনও ডিজাইনের গন্ধযুক্ত?

10
এটি পড়ার জন্য অনেক দীর্ঘ, পুনর্বিবেচনা বিবেচনা করার জন্য, সেখানে প্রচুর অপ্রাসঙ্গিক স্টাফ রয়েছে। আপনি ভাল উত্তরগুলি মিস করতে পারেন কারণ লোকেরা সমস্ত পড়তে বিরক্ত করবেন না।
ইয়ানিস

আপনি বলেছিলেন যে আপনি ক্যালিবার্নকে ভালোবাসেন M মাইক্রো, তবুও আপনি জানেন না কীভাবে এই কাঠামোটি নতুন দর্শন মডেলগুলিকে ইনস্ট্যান্ট করতে সহায়তা করতে পারে? এর কয়েকটি উদাহরণ পরীক্ষা করে দেখুন।
ইউফোরিক

@ ইউফোরিক আপনি কি আরও সুনির্দিষ্ট হতে পারেন, গুগল এখানে আমাকে সাহায্য করবে বলে মনে হয় না। আমি কি কিছু কীওয়ার্ড সন্ধান করতে পারি?
ডিভিডিভোরলে

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

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

উত্তর:


2

নতুন ভিউ মডেল শুরু করার সময় নির্ভরতার বিষয়টি আইওসি দিয়ে পরিচালনা করা যায়।

public class MyCustomViewModel{
  private readonly IShoppingCartWebService _cartService;

  private readonly ITimeService _timeService;

  public ProductDTO ProductDTO { get; set; }

  public ProductDetailsViewModel(IShoppingCartWebService cartService, ITimeService timeService){
    _cartService = cartService;
    _timeService = timeService;
  }
}

ধারক স্থাপন করার সময় ...

Container.Register<IShoppingCartWebService,ShoppingCartWebSerivce>().As.Singleton();
Container.Register<ITimeService,TimeService>().As.Singleton();
Container.Register<ProductDetailsViewModel>();

আপনি যখন আপনার ভিউ মডেল প্রয়োজন:

var viewmodel = Container.Resolve<ProductDetailsViewModel>();
viewmodel.ProductDTO = myProductDTO;

ক্যালিবার্ন মাইক্রো এর মতো কাঠামো ব্যবহার করার সময় প্রায়শই আইওসি ধারকটির কিছু ফর্ম ইতিমধ্যে উপস্থিত থাকে।

SomeCompositionView view = new SomeCompositionView();
ISomeCompositionViewModel viewModel = IoC.Get<ISomeCompositionViewModel>();
ViewModelBinder.Bind(viewModel, view, null);

1

আমি এএসপি.নেট এমভিসির সাথে প্রতিদিন কাজ করি এবং এক বছরেরও বেশি সময় ধরে ডব্লিউপিএফ-এ কাজ করেছি এবং আমি এটি এটাই দেখতে পাই:

MVC

নিয়ামকটি ক্রিয়াগুলি অর্কেস্টেট করার কথা (এটি আনুন, এটি যুক্ত করুন)।

দর্শনটি মডেলটি প্রদর্শনের জন্য দায়ী।

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

MVVM

মডেলটিতে সাধারণত ডেটা থাকে (প্রাক্তন ইউজারআইডি, ফার্স্টনাম) এবং প্রায়শই প্রায় পাস করা হয়

ভিউ মডেলটি ভিউ (পদ্ধতি), তার ডেটা (মডেল) এবং ইন্টারঅ্যাকশনস (কমান্ড) এর আচরণকে অন্তর্ভুক্ত করে - সক্রিয় এমভিপি প্যাটার্নের অনুরূপ যেখানে উপস্থাপক মডেল সম্পর্কে সচেতন। ভিউ মডেলটি ভিউ সুনির্দিষ্ট (1 ভিউ = 1 ভিউ মডেল)।

ভিউটি মডেলটিতে ডেটা এবং ডেটা-বাঁধাই প্রদর্শন করার জন্য দায়ী। একটি দৃশ্য তৈরি করা হয়, সাধারণত এটির সাথে সম্পর্কিত যুক্ত মডেলটি তৈরি করা হয়।


আপনার যা মনে রাখা উচিত তা হ'ল এমভিভিএম উপস্থাপনা প্যাটার্ন তাদের ডাটা-বন্ডিং প্রকৃতির কারণে ডাব্লুপিএফ / সিলভারলাইটের সাথে সুনির্দিষ্ট।

ভিউটি সাধারণত কোন ভিউ মডেলটির সাথে সম্পর্কিত (বা এটির একটি বিমূর্ততা) জানে।

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

public partial class EditUserView
{
    public EditUserView(IContainer container, int userId) : this() {
        var viewModel = container.Resolve<EditUserViewModel>();
        viewModel.LoadModel(userId);
        DataContext = viewModel;
    }
}

এই ক্ষেত্রে উদাহরণ হিসাবে, আপনি ব্যবহারকারী আপডেট হওয়া সম্পর্কিত নির্দিষ্ট একটি ভিউ মডেল তৈরি করবেন না - পরিবর্তে মডেলটিতে ব্যবহারকারী নির্দিষ্ট ডেটা থাকবে যা ভিউ মডেলের কিছু কলের মাধ্যমে লোড হয়ে যায়।


যদি আমার প্রথম নামটি "পিটার" হয় এবং আমার শিরোনামগুলি হ'ল "রেভ", "ডাঃ"} *, আপনি কেন ফার্স্টনেম ডেটা এবং শিরোনামের অবস্থা বিবেচনা করবেন? অথবা আপনি আপনার উদাহরণ স্পষ্ট করতে পারেন? * আসলেই নয়
পিট কির্খাম

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

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

1

আপনার প্রশ্নের সংক্ষিপ্ত উত্তর:

  1. হ্যাঁ স্টেট + আচরণ এই সমস্যাগুলির দিকে পরিচালিত করে, তবে এটি সমস্ত ওওর পক্ষে সত্য। আসল অপরাধী ভিউমোডেলসকে সংযুক্ত করা যা এক ধরণের এসআরপি লঙ্ঘন।
  2. পরিসংখ্যানগতভাবে টাইপ করা হয়েছে, সম্ভবত। তবে আপনার অন্যান্য ভিউমোডেলগুলি থেকে ভিউমোডেলগুলি ইনস্ট্যান্ট করার জন্য আপনার প্রয়োজনীয়তা হ্রাস / অপসারণ করা উচিত।
  3. আমি সচেতন না তা নয়।
  4. না, তবে সম্পর্কযুক্ত অবস্থা এবং আচরণের সাথে ভিউমোডেলগুলি রয়েছে (কিছু মডেল রেফারেন্স এবং কিছু ভিউমোডেল রেফারেন্সের মতো)

দীর্ঘ সংস্করণ:

আমরা একই সমস্যার মুখোমুখি হয়েছি এবং এমন কিছু জিনিস পেয়েছি যা আপনাকে সহায়তা করতে পারে। যদিও আমি "যাদু" সমাধানটি জানি না, তবে এই জিনিসগুলি ব্যথাটি কিছুটা কমিয়ে দিচ্ছে।

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

  2. আপনার ভিউমোডেলগুলি দ্বিগুণ করুন। ক্যালিবার্ন ভিউমোডেলগুলি এক সাথে জুটি করা সহজ করে। এমনকি এটির স্ক্রিন / কন্ডাক্টর মডেলের মাধ্যমেও এটিকে পরামর্শ দেয়। তবে এই সংমিশ্রণটি ভিউমোডেলগুলিকে ইউনিট পরীক্ষা করা শক্ত করে তোলে, প্রচুর নির্ভরতা তৈরি করে এবং সবচেয়ে গুরুত্বপূর্ণ: আপনার ভিউমোডেলগুলিতে ভিউমোডেল জীবনচক্র পরিচালনার বোঝা চাপিয়ে দেয়। এগুলি ডিকুয়াল করার একটি উপায় হ'ল নেভিগেশন পরিষেবা বা ভিউমোডেল নিয়ন্ত্রকের মতো কিছু ব্যবহার করা। যেমন

    পাবলিক ইন্টারফেস আইএসওভিউমোডেলস {শূন্য শো (অবজেক্ট ইনলাইনআর্গমেন্টস এএসনামস টাইপ, স্ট্রিং রিজিওনআইডি); }

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

  1. আপনার ধারকগুলি "স্ট্রাইলি" টাইপযুক্ত / গতিশীল বৈশিষ্ট্যগুলি ব্যবহার করুন। যদিও INeedData<T1,T2,...>টাইপ-সেফ ক্রিয়েশন প্যারামিটারগুলির মতো এমন কিছু তৈরি করা এবং প্রয়োগ করা সম্ভব হতে পারে তবে এটি উপযুক্ত নয়। এছাড়াও প্রতিটি ভিউমোডেল প্রকারের জন্য কারখানাগুলি তৈরি করা উপযুক্ত নয়। বেশিরভাগ আইওসি কনটেইনার এটির সমাধান সরবরাহ করে। রানটাইমের সময় আপনি ত্রুটিগুলি পেয়ে যাবেন তবে ডি-কাপলিং এবং ইউনিট টেস্টিবিলিটির পক্ষে এটি উপযুক্ত। আপনি এখনও কিছু একীকরণের পরীক্ষা করেন এবং এই ত্রুটিগুলি সহজেই চিহ্নিত করা হয় spot

0

আমি সাধারণত যেভাবে এটি করি (PRISM ব্যবহার করে), প্রতিটি সমাবেশে একটি ধারক আরম্ভের মডিউল থাকে, যেখানে সমস্ত ইন্টারফেস, দৃষ্টান্ত স্টার্টআপে নিবন্ধিত হয় on

private void RegisterResources()
{
    Container.RegisterType<IDataService, DataService>();
    Container.RegisterType<IProductSearchViewModel, ProductSearchViewModel>();
    Container.RegisterType<IProductDetailsViewModel, ProductDetailsViewModel>();
}

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

/// <summary>
/// IDataService Interface
/// </summary>
public interface IDataService
{
    DataTable GetSomeData();
}

public class DataService : IDataService
{
    public DataTable GetSomeData()
    {
        MessageBox.Show("This is a call to the GetSomeData() method.");

        var someData = new DataTable("SomeData");
        return someData;
    }
}

public interface IProductSearchViewModel
{
}

public class ProductSearchViewModel : IProductSearchViewModel
{
    private readonly IUnityContainer _container;

    /// <summary>
    /// This will get resolved if it's been added to the container.
    /// Or alternately you could use constructor resolution. 
    /// </summary>
    [Dependency]
    public IDataService DataService { get; set; }

    public ProductSearchViewModel(IUnityContainer container)
    {
        _container = container;
    }

    public void SearchAndDisplay()
    {
        DataTable results = DataService.GetSomeData();

        var detailsViewModel = _container.Resolve<IProductDetailsViewModel>();
        detailsViewModel.DisplaySomeDataInView(results);

        // Create the view, usually resolve using region manager etc.
        var detailsView = new DetailsView() { DataContext = detailsViewModel };
    }
}

public interface IProductDetailsViewModel
{
    void DisplaySomeDataInView(DataTable dataTable);
}

public class ProductDetailsViewModel : IProductDetailsViewModel
{
    private readonly IUnityContainer _container;

    public ProductDetailsViewModel(IUnityContainer container)
    {
        _container = container;
    }

    public void DisplaySomeDataInView(DataTable dataTable)
    {
    }
}

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


0

কখনও কখনও পূর্ণ-বিকাশের উদাহরণের চেয়ে সহজ সংজ্ঞাটিতে যাওয়া ভাল: http://en.wikedia.org/wiki/Model_View_ViewModel সম্ভবত জে কে জাভা উদাহরণ পড়া সি # এর চেয়ে বেশি আলোকিত।

অন্য সময় আপনার অন্ত্র প্রবৃত্তি শুনতে ...

উভয় স্টেট / আচরণের সাথে ভিউমোডেলগুলি কী কোনও ডিজাইনের গন্ধযুক্ত?

আপনার মডেলগুলি কি টেবিল ম্যাপিংয়ের প্রতি লক্ষ্য? সম্ভবত কোনও ওআরএম ব্যবসা পরিচালনা করার সময় বা একাধিক টেবিল আপডেট করার সময় ডোমেন অবজেক্টগুলিতে ম্যাপিংয়ে সহায়তা করবে।

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