এটি এমভিপি এবং আপনার নির্দিষ্ট সমস্যাগুলিতে আমার নম্র গ্রহণ।
প্রথমত , কোনও কিছু যা ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করতে পারে বা কেবল প্রদর্শিত হতে পারে, তা একটি দৃশ্য । আইন, আচরণ এবং এরূপ বৈশিষ্ট্যের বৈশিষ্ট্য একটি ইন্টারফেস দ্বারা বর্ণিত হয় । এই ইন্টারফেসটি উইনফরমস ইউআই, একটি কনসোল ইউআই, একটি ওয়েব ইউআই বা এমনকি কোনও ইউআই ব্যবহার করে প্রয়োগ করা যেতে পারে (সাধারণত উপস্থাপকের পরীক্ষা করার সময়) - কংক্রিটের প্রয়োগ যতক্ষণ তা তার দৃষ্টিভঙ্গির ইন্টারফেসের আইন মেনে চলা ততক্ষণ গুরুত্বপূর্ণ নয় it ।
দ্বিতীয়ত , একটি দৃশ্য সর্বদা উপস্থাপক দ্বারা নিয়ন্ত্রিত হয় । এই জাতীয় উপস্থাপকের আইন, আচরণ এবং বৈশিষ্ট্যগুলি একটি ইন্টারফেস দ্বারাও বর্ণিত হয় । যতক্ষণ না এটি তার দৃষ্টিভঙ্গি ইন্টারফেসের আইন মানায় ততক্ষণ এই ইন্টারফেসটির কংক্রিট ভিউ বাস্তবায়নে আগ্রহ নেই।
তৃতীয়ত , যেহেতু একজন উপস্থাপক তার দৃষ্টিভঙ্গি নিয়ন্ত্রণ করে, নির্ভরতা হ্রাস করার জন্য তার উপস্থাপক সম্পর্কে কিছু জানার সাথে দৃষ্টিভঙ্গি আসলেই লাভ হয় না। উপস্থাপক এবং দর্শনের মধ্যে একটি সম্মত চুক্তি রয়েছে এবং এটি ভিউ ইন্টারফেসের দ্বারা বর্ণিত।
তৃতীয়টির প্রভাবগুলি হ'ল :
- উপস্থাপকের এমন কোনও পদ্ধতি নেই যা দর্শন কল করতে পারে তবে ভিউটিতে এমন ইভেন্ট রয়েছে যা উপস্থাপক সাবস্ক্রাইব করতে পারেন।
- উপস্থাপক এর দৃষ্টিভঙ্গি জানেন। আমি কংক্রিট উপস্থাপকের উপর কনস্ট্রাক্টর ইনজেকশন দিয়ে এটি সম্পাদন করতে পছন্দ করি।
- কোন উপস্থাপক এটি নিয়ন্ত্রণ করছে তা দর্শনটির কোনও ধারণা নেই; এটি কেবল কোনও উপস্থাপক সরবরাহ করা হবে না।
আপনার ইস্যুটির জন্য, উপরেরগুলি কিছুটা সরলীকৃত কোডে এটির মতো দেখতে পারে:
interface IConfigurationView
{
event EventHandler SelectConfigurationFile;
void SetConfigurationFile(string fullPath);
void Show();
}
class ConfigurationView : IConfigurationView
{
Form form;
Button selectConfigurationFileButton;
Label fullPathLabel;
public event EventHandler SelectConfigurationFile;
public ConfigurationView()
{
this.selectConfigurationFileButton.Click += delegate
{
var Handler = this.SelectConfigurationFile;
if (Handler != null)
{
Handler(this, EventArgs.Empty);
}
};
}
public void SetConfigurationFile(string fullPath)
{
this.fullPathLabel.Text = fullPath;
}
public void Show()
{
this.form.ShowDialog();
}
}
interface IConfigurationPresenter
{
void ShowView();
}
class ConfigurationPresenter : IConfigurationPresenter
{
Configuration configuration = new Configuration();
IConfigurationView view;
public ConfigurationPresenter(IConfigurationView view)
{
this.view = view;
this.view.SelectConfigurationFile += delegate
{
var selectFilePresenter = Gimme.The<ISelectFilePresenter>();
selectFilePresenter.ShowView();
this.configuration.FullPath = selectFilePresenter.FullPath;
this.view.SetConfigurationFile(this.configuration.FullPath);
};
}
public void ShowView()
{
this.view.SetConfigurationFile(this.configuration.FullPath);
this.view.Show();
}
}
উপরের পাশাপাশি, আমার সাধারণত একটি বেস IView
ইন্টারফেস থাকে যেখানে আমি স্ট্যাশ করি Show()
এবং যে কোনও মালিক দেখেন বা শিরোনাম দেখেন যা আমার দর্শনগুলি সাধারণত উপভোগ করে।
আপনার প্রশ্নের উত্তর:
1. উইনফর্মটি লোড হয়ে গেলে, এটির একটি ট্রিউব দেখুন obtain আমি কি এই ভেবে সঠিক হয়েছি যে ভিউটি কোনও পদ্ধতিতে যেমন কল করা উচিত যেমন: প্রেজেন্টার.জেট্রি (), এটি পরিবর্তিতভাবে মডেলকে উপস্থাপন করবে, যা ট্রিভিউয়ের জন্য ডেটা প্রাপ্ত করবে, এটি তৈরি করবে এবং এটি কনফিগার করবে, এটিকে ফিরিয়ে দেবে উপস্থাপক, যা ঘুরে দেখা যাবে যা পরে কেবল এটি অর্পণ করবে, বলতে, একটি প্যানেল?
আমি কল করবে IConfigurationView.SetTreeData(...)
থেকে IConfigurationPresenter.ShowView()
ডানদিকে কল করার আগে,IConfigurationView.Show()
২. উইনফর্মের কোনও ডেটা নিয়ন্ত্রণের জন্যও কি এটি একই হবে, যেমন আমারও একটি ডেটাগ্রিডভিউ রয়েছে?
হ্যাঁ, আমি এটির IConfigurationView.SetTableData(...)
জন্য ফোন করব । এটি প্রদত্ত ডেটা ফর্ম্যাট করার দৃষ্টিভঙ্গি অবধি। উপস্থাপক কেবল দৃশ্যের চুক্তিটি মানেন যে এটি টবুলার ডেটা চায়।
৩. মাই অ্যাপ, একই সমাবেশে বেশ কয়েকটি মডেল ক্লাস রয়েছে model এটি প্লাগইনগুলির সাথে একটি প্লাগইন আর্কিটেকচার সমর্থন করে যা প্রারম্ভকালে লোড করা প্রয়োজন। দৃশ্যটি কেবল উপস্থাপক পদ্ধতিটিকে কল করবে, যার ফলে এমন কোনও পদ্ধতি কল করবে যা প্লাগইনগুলি লোড করে এবং ভিউটিতে তথ্য প্রদর্শন করে? কোন স্তরটি প্লাগইন রেফারেন্সগুলি নিয়ন্ত্রণ করবে control ভিউ তাদের বা উপস্থাপকের কাছে রেফারেন্স রাখবে?
প্লাগইনগুলি যদি ভিউ-রিলেটেড হয়, তবে ভিউগুলি তাদের সম্পর্কে জানা উচিত, তবে উপস্থাপক নয়। যদি সেগুলি সমস্ত ডেটা এবং মডেল সম্পর্কে থাকে তবে তাদের সাথে ভিউয়ের কিছু করার দরকার নেই।
৪. আমি কি ভেবে ভেবে ঠিক করেছি যে ট্রিউজভিউ নোডের রঙ থেকে শুরু করে ডাটাগ্রিডের আকার ইত্যাদির উপস্থাপনা সম্পর্কিত প্রতিটি জিনিসই ভিউতে পরিচালনা করা উচিত?
হ্যাঁ. এটিকে XML সরবরাহকারী উপস্থাপক হিসাবে ভাবুন যা ডেটা এবং সেই ভিউ যা ডেটা গ্রহণ করে এবং এতে একটি সিএসএস স্টাইলশিট প্রয়োগ করে describes কংক্রিটের ভাষায়, উপস্থাপক কল করতে পারেন IRoadMapView.SetRoadCondition(RoadCondition.Slippery)
এবং তারপরে দৃশ্যটি লাল রঙে রাস্তাটি প্রেরণ করে।
ক্লিক করা নোডগুলির জন্য ডেটা সম্পর্কে কী?
৫. আমি যখন ট্রেইনোডগুলিতে ক্লিক করি, তখন আমি কি নির্দিষ্ট নোডটি দিয়ে উপস্থাপকের কাছে যাব এবং তারপরে উপস্থাপকটি কী ডেটা প্রয়োজন তা নিয়ে কাজ করবে এবং তারপরে মডেলটিকে সেই ভিউটিতে ফিরে উপস্থাপনের আগে সেই তথ্যটির জন্য জিজ্ঞাসা করবে?
যদি সম্ভব হয় তবে আমি গাছকে একটি শটে ভিউতে উপস্থাপন করার জন্য প্রয়োজনীয় সমস্ত ডেটা পাস করতাম। তবে যদি কিছু ডেটা শুরু থেকে পাস করার জন্য খুব বড় হয় বা যদি এটি প্রকৃতির গতিশীল হয় এবং মডেলটির (উপস্থাপকের মাধ্যমে) "সর্বশেষ স্ন্যাপশট" প্রয়োজন হয়, তবে আমি event LoadNodeDetailsEventHandler LoadNodeDetails
ভিউ ইন্টারফেসের মতো কিছু যুক্ত করব , যাতে উপস্থাপিকা এতে সাবস্ক্রাইব করতে পারবেন, LoadNodeDetailsEventArgs.Node
মডেল থেকে নোড ইন (সম্ভবত কোনও ধরণের আইডির মাধ্যমে) বিশদটি আনতে পারেন , যাতে ইভেন্ট হ্যান্ডলার প্রতিনিধি ফিরে আসার সাথে ভিউটি তার প্রদর্শিত নোডের বিশদ আপডেট করতে পারে। নোট করুন যে কোনও ভাল ব্যবহারকারীর অভিজ্ঞতার জন্য ডেটা আনতে খুব ধীর হতে পারে তবে এগুলির async নিদর্শনগুলির প্রয়োজন হতে পারে।