MVVM (Model-View-ViewModel) Design Pattern

Mobile App Development - ডট নেট এমআইইউআই (.NET MAUI)
171
171

MVVM (Model-View-ViewModel) হল একটি জনপ্রিয় ডিজাইন প্যাটার্ন যা বিশেষভাবে .NET MAUI, Xamarin, এবং অন্যান্য UI ভিত্তিক অ্যাপ্লিকেশন ডেভেলপমেন্টে ব্যবহৃত হয়। এটি অ্যাপ্লিকেশনের UI এবং লজিকের মধ্যে পরিষ্কারভাবে পার্থক্য করে, এবং অ্যাপ্লিকেশন উন্নয়নকে আরও পরিষ্কার, মডুলার এবং মেইনটেনেবল করে।

MVVM প্যাটার্ন তিনটি প্রধান উপাদান নিয়ে কাজ করে:

  1. Model
  2. View
  3. ViewModel

1. Model:

  • বর্ণনা: Model হল অ্যাপ্লিকেশনের ডেটা এবং লজিকের প্রতিনিধিত্ব। এটি সাধারণত অ্যাপ্লিকেশনের ব্যবসায়িক লজিক, ডেটা সঞ্চয়, এবং ডেটাবেস অ্যাক্সেসের সাথে সম্পর্কিত কোড ধারণ করে। Model UI এর সাথে সরাসরি ইন্টারঅ্যাক্ট করে না।
  • উদাহরণ: একটি অ্যাপের প্রোফাইল পৃষ্ঠা যেখানে ব্যবহারকারীর তথ্য সেভ এবং লোড করা হয়।

2. View:

  • বর্ণনা: View হল UI উপাদান, যা ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করে এবং UI এর দৃষ্টিভঙ্গি প্রদান করে। এটি সরাসরি ডেটা ম্যানেজমেন্ট বা ব্যবসায়িক লজিকের সাথে জড়িত না হয়ে শুধুমাত্র ViewModel এর সাথে ডেটা এবং ইভেন্ট বাইন্ডিং এর মাধ্যমে যোগাযোগ করে।
  • উদাহরণ: অ্যাপের বিভিন্ন পেজ বা স্ক্রীন যেমন ফর্ম, লিস্ট, বা গ্রিড।

3. ViewModel:

  • বর্ণনা: ViewModel হল Model এবং View এর মধ্যে মধ্যস্থতাকারী। এটি View এর জন্য ডেটা প্রস্তুত করে এবং Model থেকে ডেটা সংগ্রহ করে, তারপর সেই ডেটা View এর জন্য উপযুক্ত আকারে প্রদান করে। ViewModel সাধারণত Bindable Properties এবং Commands ব্যবহার করে View এর সাথে ইন্টারঅ্যাক্ট করে।
  • উদাহরণ: একটি বাটনে ক্লিক করলে ডেটা ফেচ করার বা কোনো ইভেন্ট হ্যান্ডলিং করার জন্য কোড।

MVVM ডিজাইন প্যাটার্নের উপকারিতা:

  1. Separation of Concerns (SoC): UI কোড এবং অ্যাপ্লিকেশনের ব্যবসায়িক লজিক আলাদা থাকে। এটি কোডের রক্ষণাবেক্ষণ এবং টেস্টিং সহজ করে।
  2. ডেটা বাইন্ডিং: ViewModel এবং View এর মধ্যে একে অপরের সাথে ডেটা সহজে শেয়ার করতে পারে।
  3. Testability: ViewModel এর মধ্যে অ্যাপ্লিকেশনের লজিক থাকে, যা সহজে টেস্ট করা যায়।
  4. Reusability: ViewModel এবং Model আলাদা থাকায়, এটি আরও সহজভাবে পুনঃব্যবহারযোগ্য হয়।

MVVM প্যাটার্নের উদাহরণ:

Model (Data Model):

public class User
{
    public string Name { get; set; }
    public string Email { get; set; }
}

ViewModel (Binding Data and Commands):

public class UserViewModel : INotifyPropertyChanged
{
    private string _userName;
    private string _userEmail;

    public event PropertyChangedEventHandler PropertyChanged;

    public string UserName
    {
        get => _userName;
        set
        {
            _userName = value;
            OnPropertyChanged();
        }
    }

    public string UserEmail
    {
        get => _userEmail;
        set
        {
            _userEmail = value;
            OnPropertyChanged();
        }
    }

    public ICommand LoadUserDataCommand { get; }

    public UserViewModel()
    {
        LoadUserDataCommand = new Command(LoadUserData);
    }

    private void LoadUserData()
    {
        // Load data from model or API
        UserName = "John Doe";
        UserEmail = "john.doe@example.com";
    }

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

View (UI Layer - XAML):

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Class="MauiApp.MainPage">

    <StackLayout>
        <Label Text="User Information" FontSize="24" HorizontalOptions="Center" />
        
        <Label Text="{Binding UserName}" FontSize="18" />
        <Label Text="{Binding UserEmail}" FontSize="18" />
        
        <Button Text="Load User Data"
                Command="{Binding LoadUserDataCommand}" />
    </StackLayout>
</ContentPage>

Binding the ViewModel with the View in Code-Behind (MainPage.xaml.cs):

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        BindingContext = new UserViewModel();
    }
}

MVVM Architecture Workflow:

  1. View (UI) ইনপুট গ্রহণ করে এবং ViewModel এর সাথে ইন্টারঅ্যাক্ট করে।
  2. ViewModel অ্যাপ্লিকেশন ডেটা Model থেকে ফেচ করে বা আপডেট করে।
  3. ViewModel ফেচ করা ডেটা বা স্টেট View তে পাঠায় এবং UI আপডেট হয়।

সারাংশ:

MVVM ডিজাইন প্যাটার্নের মাধ্যমে .NET MAUI অ্যাপ্লিকেশন গুলির UI এবং ব্যবসায়িক লজিক পৃথক করা যায়, যা কোডের রক্ষণাবেক্ষণ, টেস্টিং, এবং পুনঃব্যবহারযোগ্যতা বাড়ায়। এই প্যাটার্নে Model, View, এবং ViewModel সঠিকভাবে একে অপরের সাথে ইন্টারঅ্যাক্ট করে, যাতে অ্যাপ্লিকেশন আরও ক্লিন এবং মডুলার হয়।

Content added By

MVVM কী এবং কেন গুরুত্বপূর্ণ?

112
112

MVVM (Model-View-ViewModel) হল একটি সফটওয়্যার আর্কিটেকচার প্যাটার্ন, যা প্রধানত UI (User Interface) ভিত্তিক অ্যাপ্লিকেশন তৈরি করতে ব্যবহৃত হয়। এটি অ্যাপ্লিকেশনের UI এবং লজিক এর মধ্যে একটি স্পষ্ট পার্থক্য সৃষ্টি করে এবং সেগুলিকে আলাদা করে কাজ করতে সহায়ক। MVVM প্যাটার্নটি বিশেষভাবে .NET MAUI, WPF, Xamarin, UWP এবং অন্যান্য UI ফ্রেমওয়ার্কে জনপ্রিয়।

MVVM তে তিনটি প্রধান উপাদান থাকে:

  1. Model:
    • এটি অ্যাপ্লিকেশনের ডেটা বা বেস লজিক প্রতিনিধিত্ব করে। এখানে সমস্ত ব্যবসায়িক লজিক, ডেটাবেস অপারেশন, ফাইল সিস্টেম অ্যাক্সেস ইত্যাদি থাকে।
    • Model অ্যাপ্লিকেশনের বাস্তব ডেটা ও কনসেপ্ট নিয়ে কাজ করে এবং ViewModel এর মাধ্যমে View এ প্রদর্শিত হয়।
  2. View:
    • এটি অ্যাপ্লিকেশনের UI বা ব্যবহারকারী ইন্টারফেস যা সরাসরি ব্যবহারকারীর সাথে যোগাযোগ করে।
    • View অ্যাপ্লিকেশনের দেখানো উপাদান (যেমন টেক্সট, বাটন, লেবেল) তৈরি করে এবং ViewModel এর সাথে Data Binding এর মাধ্যমে যোগাযোগ করে।
  3. ViewModel:
    • এটি Model এর ডেটা এবং View এর মধ্যে একটি মধ্যস্থতাকারী হিসেবে কাজ করে। ViewModel ব্যবসায়িক লজিক থেকে আলাদা UI লজিক সরবরাহ করে।
    • এটি Data Binding এর মাধ্যমে View এবং Model এর মধ্যে সম্পর্ক তৈরি করে। ViewModel ডেটা বা UI লজিক আপডেট করার জন্য View এর পরিবর্তনগুলি সনাক্ত করে।

MVVM এর কাজের পদ্ধতি:

  • Model ডেটা রাখে এবং কোনো ডেটার পরিবর্তন ঘটলে তা ViewModel কে জানান দেয়।
  • ViewModel এই পরিবর্তন গ্রহণ করে এবং সেই ডেটা View এ পাঠিয়ে দেয় (বা পরিবর্তন করে)।
  • View ডেটার নতুন মান দেখানোর জন্য ViewModel এর উপর নির্ভর করে।

MVVM এর গুরুত্ব:

  1. কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি:
    • MVVM প্যাটার্নে UI এবং লজিক একে অপর থেকে আলাদা থাকে। তাই UI ডিজাইন এবং ব্যবসায়িক লজিক আলাদাভাবে পরীক্ষা, রক্ষণাবেক্ষণ এবং পুনঃব্যবহার করা সম্ভব হয়।
  2. সহজ পরীক্ষা (Testability):
    • ViewModel-এ সমস্ত লজিক থাকায় এটি সহজে টেস্ট করা যায়, কারণ এটি UI থেকে আলাদা থাকে। এটি ডেভেলপারদের ইউনিট টেস্টিং এর সুবিধা দেয়, যা সফটওয়্যার ডেভেলপমেন্টে খুবই গুরুত্বপূর্ণ।
  3. UI এবং লজিকের আলাদা পৃথকীকরণ:
    • UI এবং লজিক আলাদা করার ফলে অ্যাপ্লিকেশনটি আরো স্কেলেবল এবং প্রশস্ত হয়। এতে অ্যাপ্লিকেশনের ব্যবসায়িক লজিকের উপর কাজ করার সময় UI তে কোনো প্রভাব পড়ে না এবং vice versa।
  4. Data Binding সুবিধা:
    • MVVM প্যাটার্নে Data Binding এর মাধ্যমে ViewModel এবং View একে অপরের সাথে সংযুক্ত থাকে। এর ফলে UI তে ডেটার পরিবর্তন স্বয়ংক্রিয়ভাবে প্রতিবিম্বিত হয় এবং UI এর কোন লজিকের প্রয়োজন হয় না।
  5. ভালো রক্ষণাবেক্ষণ (Maintainability):
    • কোডের এই স্পষ্টভাবে বিভক্ত কাঠামোকে রক্ষণাবেক্ষণ করা সহজ। যখন View এবং Model একে অপরের উপর নির্ভরশীল থাকে না, তখন অ্যাপ্লিকেশনের যে কোনও অংশ পরিবর্তন বা আপডেট করা সহজ হয়।
  6. UI-নির্ভর কোডের কমানোর সুবিধা:
    • MVVM ব্যবহারের মাধ্যমে UI কোড কমানো সম্ভব হয়। এই প্যাটার্নে UI-এর যাবতীয় লজিক ViewModel এ থাকে, যার ফলে UI কন্ট্রোলগুলির কোডিং সহজ হয় এবং UI পুনরাবৃত্তি হতে পারে।

MVVM উদাহরণ (Data Binding এর মাধ্যমে)

ধরা যাক, আমাদের একটি Person মডেল আছে এবং আমরা এটি View তে প্রদর্শন করতে চাই।

Model:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

ViewModel:

public class PersonViewModel
{
    public Person CurrentPerson { get; set; }
    
    public PersonViewModel()
    {
        CurrentPerson = new Person { Name = "John Doe", Age = 30 };
    }
}

XAML (View):

<Label Text="{Binding CurrentPerson.Name}" />
<Label Text="{Binding CurrentPerson.Age}" />

Code-behind:

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        BindingContext = new PersonViewModel();
    }
}

সারাংশ:

  • MVVM প্যাটার্নের মাধ্যমে অ্যাপ্লিকেশন ডেভেলপমেন্টে UI এবং লজিক আলাদা রাখা হয়, যা কোডের রক্ষণাবেক্ষণ, টেস্টিং, এবং স্কেলেবিলিটি অনেক সহজ করে।
  • Model ডেটা রাখে, ViewModel ডেটা এবং লজিক পরিচালনা করে এবং View শুধুমাত্র UI উপস্থাপন করে।
  • এটি অ্যাপ্লিকেশন তৈরি করার সময় ডেভেলপারদের জন্য কার্যকরী সমাধান প্রদান করে, যা কোড ক্লিন এবং পরিষ্কার রাখে।
Content added By

Model, View, এবং ViewModel এর সম্পর্ক

123
123

MVVM (Model-View-ViewModel) একটি জনপ্রিয় ডিজাইন প্যাটার্ন যা .NET MAUI এবং অন্যান্য UI ভিত্তিক অ্যাপ্লিকেশনের উন্নয়নে ব্যবহৃত হয়। এটি মূলত UI (ব্যবহারকারীর ইন্টারফেস) এবং ব্যাকএন্ড লজিক (ডেটা এবং ব্যবসায়িক লজিক) এর মধ্যে পরিষ্কার আলাদা করার জন্য ডিজাইন করা হয়েছে। MVVM প্যাটার্নে তিনটি মূল উপাদান থাকে:

  1. Model
  2. View
  3. ViewModel

এই তিনটি উপাদান একে অপরের সাথে যোগাযোগ করে, কিন্তু তাদের কাজ এবং দায়িত্বের ক্ষেত্র আলাদা থাকে।


1. Model (মডেল)

Model হল অ্যাপ্লিকেশনের ডেটা এবং ব্যবসায়িক লজিক। এটি সমস্ত ডেটা বা ডেটার সংজ্ঞা, নিয়ম এবং এপ্লিকেশনের শর্তাবলী ধারণ করে। Model এর প্রধান কাজ হল ডেটা সংরক্ষণ এবং ডেটা সম্পর্কিত কাজ করা, যেমন: ডেটা সংগ্রহ করা, আপডেট করা বা ভ্যালিডেশন করা।

  • Model এর সাথে UI বা View এর কোনো সরাসরি সম্পর্ক থাকে না।
  • Model ডেটার ভিত্তিতে কাজ করে এবং এটি সাধারণত ডেটাবেস বা API থেকে ডেটা সংগ্রহ করে।

উদাহরণ:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

এখানে, Person একটি Model যা ডেটা ধারণ করে, যেমন Name এবং Age


2. View (ভিউ)

View হল ব্যবহারকারীর ইন্টারফেস (UI), যা ব্যবহারকারীকে ডেটা দেখায় এবং ব্যবহারকারীর ইন্টারঅ্যাকশন গ্রহণ করে। এটি মূলত UI কন্ট্রোল (যেমন: Label, Button, Entry) থেকে গঠিত। View এর মূল কাজ হল দেখানো এবং ইন্টারঅ্যাক্ট করা; তবে এতে কোনো ব্যবসায়িক লজিক বা ডেটা প্রক্রিয়াকরণের কাজ থাকে না।

  • View শুধুমাত্র ViewModel এর সাথে যোগাযোগ করে এবং ডেটা দেখানোর জন্য কেবল binding ব্যবহার করে।
  • View শুধুমাত্র ইউজার ইন্টারঅ্যাকশন গ্রহণ করে, তবে এটি Model বা ডেটার সাথে সরাসরি কাজ করে না।

উদাহরণ:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Class="MyApp.MainPage">
    <Label Text="{Binding Name}" />
    <Button Text="Change Name" Command="{Binding ChangeNameCommand}" />
</ContentPage>

এখানে, Label এবং Button হল View উপাদান যা ViewModel এর সাথে data binding এর মাধ্যমে যুক্ত।


3. ViewModel (ভিউমডেল)

ViewModel হল Model এবং View এর মধ্যে একটি মধ্যস্থতাকারী উপাদান। এটি Model থেকে ডেটা সংগ্রহ করে এবং View এর জন্য উপস্থাপনযোগ্য রূপে রূপান্তরিত করে। ViewModel ব্যবহারকারীর ইন্টারঅ্যাকশন এবং ডেটা চেঞ্জ এর জন্য ইভেন্ট এবং কমান্ড সরবরাহ করে।

  • ViewModel Model এর ডেটা ধারণ করে এবং সেগুলিকে View এর জন্য প্রস্তুত করে (ডেটা ফরম্যাটিং, ভ্যালিডেশন ইত্যাদি)।
  • ViewModel এবং View এর মধ্যে data binding থাকে, যা UI কে ডেটা এবং ইউজার ইন্টারঅ্যাকশন পরিবর্তনগুলোর সাথে সিঙ্ক্রোনাইজ করে।

উদাহরণ:

public class MainPageViewModel : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get => _name;
        set
        {
            _name = value;
            OnPropertyChanged();
        }
    }

    public ICommand ChangeNameCommand { get; }

    public MainPageViewModel()
    {
        ChangeNameCommand = new Command(ChangeName);
    }

    private void ChangeName()
    {
        Name = "John Smith";
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

এখানে, ViewModel Name প্রপার্টি এবং ChangeNameCommand কমান্ডের মাধ্যমে View কে ডেটা এবং ইন্টারঅ্যাকশন সরবরাহ করছে।


Model, View, এবং ViewModel এর সম্পর্ক

  • Model: ডেটা সংরক্ষণ এবং ব্যবসায়িক লজিক (যেমন Person ক্লাস)।
  • View: UI উপাদানগুলি যেমন Label, Button যা ব্যবহারকারীকে দেখানো হয় এবং ইন্টারঅ্যাকশন নেওয়া হয়।
  • ViewModel: Model থেকে ডেটা নিয়ে তা View এর জন্য উপস্থাপন করে। এটি Model এবং View এর মধ্যে একটি মধ্যস্থতাকারী হিসেবে কাজ করে।

MVVM প্যাটার্নের কাজের প্রক্রিয়া:

  1. Model ডেটা প্রস্তুত করে এবং ViewModel এর মাধ্যমে সেটি View এ প্রেরণ করা হয়।
  2. ViewModel ডেটা পরিবর্তন এবং ব্যবহারকারীর ইন্টারঅ্যাকশন (যেমন: বোতাম টিপলে কি হবে) পরিচালনা করে।
  3. View ব্যবহারকারীর ইন্টারঅ্যাকশন (যেমন: বোতাম ক্লিক করা) গ্রহণ করে এবং এটি ViewModel এর কমান্ডের মাধ্যমে Model এর সাথে যোগাযোগ করে।

উপসংহার:

MVVM প্যাটার্ন ব্যবহার করলে:

  • Model এবং View এর মধ্যে সরাসরি সম্পর্কের প্রয়োজন হয় না।
  • View এবং ViewModel এর মধ্যে data binding এর মাধ্যমে যোগাযোগ ঘটে।
  • ViewModel হল Model এবং View এর মধ্যে একটি মধ্যস্থতাকারী, যা ডেটাকে ভিউয়ের জন্য প্রস্তুত করে এবং UI এবং ডেটার মধ্যে সিঙ্ক্রোনাইজেশন নিশ্চিত করে।

এভাবে, MVVM অ্যাপ্লিকেশন ডেভেলপমেন্টকে পরিষ্কার, মডুলার এবং পুনঃব্যবহারযোগ্য করে তোলে।

Content added By

Dependency Injection এবং MVVM Toolkit ব্যবহার

148
148

Dependency Injection (DI) এবং MVVM Toolkit দুটি গুরুত্বপূর্ণ ধারণা যা .NET MAUI এবং Xamarin.Forms সহ অন্যান্য .NET অ্যাপ্লিকেশন উন্নয়ন ব্যবস্থায় ব্যবহৃত হয়। এগুলি বিশেষভাবে MVVM (Model-View-ViewModel) আর্কিটেকচারের উন্নয়ন প্রক্রিয়ায় সাহায্য করে এবং অ্যাপ্লিকেশন ডিজাইনকে আরও সিস্টেম্যাটিক ও মডুলার করে তোলে।

Dependency Injection (DI):

Dependency Injection (DI) একটি ডিজাইন প্যাটার্ন যা অবজেক্ট বা ক্লাসের মধ্যে নির্ভরশীলতা (dependencies) ইনজেক্ট করার জন্য ব্যবহৃত হয়, যাতে কোডের পুনঃব্যবহারযোগ্যতা, পরীক্ষাযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা বৃদ্ধি পায়।

ব্যবহার:

  • Dependency Injection এর মাধ্যমে, আপনি যেকোনো সেবা বা ডিপেন্ডেন্সি সরাসরি আপনার ক্লাসে ইনজেক্ট করতে পারেন, এর ফলে একে অন্যের উপর নির্ভরশীলতা কমে যায়।
  • এটি অ্যাপ্লিকেশন কমপ্লেক্সিটির উন্নতি ঘটায় এবং একক ক্লাসের কাজ সীমাবদ্ধ করে যাতে আপনি সহজে কোড পরিবর্তন ও পরীক্ষা করতে পারেন।

উদাহরণ:

  1. Service Interface তৈরি করা:
public interface ILoggingService
{
    void Log(string message);
}
  1. Service Class তৈরি করা:
public class ConsoleLoggingService : ILoggingService
{
    public void Log(string message)
    {
        Console.WriteLine(message);
    }
}
  1. Dependency Injection সেটআপ করা:
using Microsoft.Extensions.DependencyInjection;

public class App : Application
{
    public App()
    {
        var services = new ServiceCollection();
        services.AddSingleton<ILoggingService, ConsoleLoggingService>(); // DI Setup

        var serviceProvider = services.BuildServiceProvider();

        var loggingService = serviceProvider.GetRequiredService<ILoggingService>();
        loggingService.Log("Hello, Dependency Injection!");

        MainPage = new MainPage();
    }
}

এখানে, আমরা ILoggingService এবং তার ConsoleLoggingService বাস্তবায়নটি তৈরি করেছি। App ক্লাসে, আমরা DI কন্টেইনারের মাধ্যমে ILoggingService কে ইনজেক্ট করেছি এবং তার পরে আমরা তা ব্যবহার করে একটি বার্তা লগ করেছি।

MVVM Toolkit:

MVVM (Model-View-ViewModel) একটি আর্কিটেকচারাল প্যাটার্ন যা অ্যাপ্লিকেশনের ইউআই এবং লজিকের মধ্যে এক ধরনের বিচ্ছেদ বজায় রাখে। MVVM Toolkit হল একটি টুলকিট যা MVVM প্যাটার্নের বাস্তবায়নকে সহজ এবং দ্রুত করে তোলে।

MVVM প্যাটার্নে:

  • Model: ডেটা বা বিজনেস লজিক।
  • View: ইউজার ইন্টারফেস।
  • ViewModel: ইউআই এর জন্য ডেটা এবং লজিকের মাঝে মিডিয়েটর।

MVVM Toolkit ডেভেলপারদের জন্য একটি শক্তিশালী টুল সেট প্রদান করে যা INotifyPropertyChanged, ObservableCollection, এবং অন্যান্য MVVM সেন্ট্রাল উপাদানগুলির সঙ্গে একযোগে কাজ করতে সহায়ক।

ব্যবহার:

1. Install MVVM Toolkit (NuGet Package):

আপনি MVVM Toolkit প্যাকেজটি NuGet থেকে ইনস্টল করতে পারেন:

Install-Package CommunityToolkit.Mvvm

2. ViewModel তৈরি করা:

MVVM Toolkit এ আপনি সাধারণত ObservableObject বা ObservableObjectBase ক্লাসকে ব্যবহার করে সহজে প্রপার্টি পরিবর্তন এবং ডেটা-বাইন্ডিং পরিচালনা করতে পারেন।

using CommunityToolkit.Mvvm.ComponentModel;

public class MainPageViewModel : ObservableObject
{
    private string name;
    
    public string Name
    {
        get => name;
        set => SetProperty(ref name, value);
    }

    public MainPageViewModel()
    {
        Name = "Hello, .NET MAUI!";
    }
}

এখানে, ObservableObject ক্লাসটি INotifyPropertyChanged এর কার্যকারিতা সরবরাহ করে। SetProperty মেথডটি প্রপার্টির পরিবর্তন ট্র্যাক করতে ব্যবহৃত হয়, যা UI-তে ডেটা আপডেট করে।

3. View (XAML) এবং ViewModel এর মধ্যে ডেটা-বাইন্ডিং:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Class="MauiApp.MainPage">

    <Label Text="{Binding Name}"
           VerticalOptions="CenterAndExpand" 
           HorizontalOptions="CenterAndExpand" />
</ContentPage>

এখানে, Label এর Text প্রপার্টি ViewModel এর Name প্রপার্টির সাথে বাইন্ড করা হয়েছে। যখন Name পরিবর্তিত হবে, UI অটোমেটিকভাবে সেই পরিবর্তন প্রতিফলিত করবে।

4. Dependency Injection এবং ViewModel সংযোগ:

public class App : Application
{
    public App()
    {
        var services = new ServiceCollection();
        services.AddSingleton<MainPageViewModel>(); // Inject ViewModel

        var serviceProvider = services.BuildServiceProvider();
        var mainPageViewModel = serviceProvider.GetRequiredService<MainPageViewModel>();

        MainPage = new MainPage
        {
            BindingContext = mainPageViewModel // Set ViewModel to the View
        };
    }
}

এখানে, MainPageViewModel কে DI কন্টেইনারের মাধ্যমে MainPage এর BindingContext হিসেবে ইনজেক্ট করা হয়েছে, যাতে Name প্রপার্টি UI-তে প্রদর্শিত হতে পারে।

Dependency Injection এবং MVVM Toolkit এর সুবিধা:

  1. Code Decoupling: DI ব্যবহারের মাধ্যমে কোডের মধ্যে সোজা নির্ভরশীলতা কমানো হয়, ফলে একে অন্যের ওপর নির্ভরশীলতা কমে যায়। ViewModel এবং UI (View) এর মধ্যে সোজা যোগাযোগ না হয়ে একে আলাদা রাখা হয়।
  2. Testability: DI এবং MVVM প্যাটার্ন অ্যাপ্লিকেশনটিকে টেস্টযোগ্য করে তোলে। ViewModel-এর লজিক সহজে ইউনিট টেস্ট করা যেতে পারে, কারণ এটি UI থেকে আলাদা থাকে।
  3. Separation of Concerns (SoC): MVVM প্যাটার্ন UI এবং বিজনেস লজিকের মধ্যে একক কনসার্ন থাকে না, বরং লজিককে ViewModel-এ রাখার মাধ্যমে আলাদা করা হয়, যা কোড পরিষ্কার এবং মেইনটেনেবল রাখে।

উপসংহার:

  • Dependency Injection (DI) এর মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনের বিভিন্ন সেবা বা ডিপেন্ডেন্সি সহজভাবে ইনজেক্ট করতে পারেন, যা কোডের পুনঃব্যবহারযোগ্যতা এবং টেস্টিং সহজ করে তোলে।
  • MVVM Toolkit MVVM প্যাটার্নের বাস্তবায়ন সহজ করে এবং ViewModel এবং View এর মধ্যে যোগাযোগ পরিষ্কার করে, যা অ্যাপ্লিকেশন ডেভেলপমেন্টকে আরও শক্তিশালী এবং সিস্টেম্যাটিক করে তোলে।
Content added By

MVVM এর মাধ্যমে Clean Architecture তৈরি

120
120

MVVM (Model-View-ViewModel) এবং Clean Architecture দুটি জনপ্রিয় আর্কিটেকচার প্যাটার্ন, যা একসাথে ব্যবহার করলে একটি সহজ, সুসংগঠিত এবং পরিস্কার কোডবেস তৈরি করতে সাহায্য করে। .NET MAUI অ্যাপ্লিকেশনে এই দুটি প্যাটার্ন ব্যবহার করে একটি শক্তিশালী এবং বর্ধনশীল অ্যাপ্লিকেশন তৈরি করা যায়।

Clean Architecture হল একটি সফটওয়্যার আর্কিটেকচার কৌশল যা অ্যাপ্লিকেশনের বিভিন্ন অংশকে আলাদা করে, যেমনঃ ডোমেইন লজিক, ডেটা অ্যাক্সেস, UI, ইত্যাদি, যাতে কোড রক্ষণাবেক্ষণ এবং পরবর্তী সময়ে এক্সটেনশন সহজ হয়।

এই টিউটোরিয়ালে MVVM এবং Clean Architecture ব্যবহার করে .NET MAUI অ্যাপ্লিকেশনে একটি সুন্দর আর্কিটেকচার তৈরি করার ধাপগুলি তুলে ধরা হবে।


1. Clean Architecture এর মূল স্তম্ভ:

Clean Architecture প্রাথমিকভাবে ৪টি স্তরে বিভক্ত:

  1. Entities (ডোমেইন লজিক)
  2. Use Cases / Interactors (অ্যাপ্লিকেশন লজিক)
  3. Interface Adapters (UI এবং ডেটা ট্রান্সফার)
  4. Frameworks & Drivers (এপিআই, ডাটাবেস, UI ফ্রেমওয়ার্ক)

এখানে, MVVM প্যাটার্নটি Interface Adapters স্তরে ব্যবহার করা হয়, যেখানে ViewModel ডোমেইন থেকে ডাটা নিয়ে ইউআই (View) এর মধ্যে পার্স করা হয়।


2. MVVM Pattern এর ধারণা:

MVVM প্যাটার্নের তিনটি প্রধান উপাদান:

  1. Model: অ্যাপ্লিকেশনের ডাটা এবং লজিকের প্রতিনিধিত্ব। এটি ডেটাবেস, ওয়েব সেবা বা অন্য কোনো সোর্স থেকে ডাটা পেতে ব্যবহৃত হয়।
  2. View: ইউজার ইন্টারফেস যা ইউজারের সাথে ইন্টারঅ্যাক্ট করে।
  3. ViewModel: এটি Model এবং View এর মধ্যে একটি মধ্যস্থতাকারী হিসেবে কাজ করে। ViewModel ইউজারের ইনপুট গ্রহণ করে এবং তা Model এ প্রক্রিয়া করে, তারপর তা View-এ দেখায়।

3. Clean Architecture এবং MVVM এর সংমিশ্রণ:

এখন, Clean Architecture অনুসারে MVVM প্যাটার্নটি .NET MAUI অ্যাপ্লিকেশনে প্রয়োগ করতে নিচের স্তরগুলো তৈরি করতে হবে:


Step 1: Project Structure

এটি প্রস্তাবিত প্রকল্পের কাঠামো, যেখানে প্রতিটি স্তর পরিষ্কারভাবে আলাদা করা হয়েছে:

- Core (Entities, Use Cases)
    - Models
    - Interfaces
    - Services
- Application (Use Cases)
    - ViewModels
    - Commands
    - Services
- Infrastructure (Frameworks, Data Access)
    - Data
    - API
    - Repositories
- UI (Interface Adapters)
    - Views
    - Resources
    - Pages

Step 2: Models (Core)

এখানে আপনি আপনার অ্যাপ্লিকেশনের ডোমেইন মডেল তৈরি করবেন। এগুলি অ্যাপ্লিকেশনের ব্যাসিক ডাটা স্ট্রাকচারগুলির প্রতিনিধিত্ব করে। উদাহরণস্বরূপ:

public class User
{
    public string Name { get; set; }
    public string Email { get; set; }
}

Step 3: Use Cases (Core)

Use Cases অ্যাপ্লিকেশনের ব্যবসায়িক লজিক বা ইউজারের কার্যকলাপগুলির প্রতিনিধিত্ব করে। প্রতিটি ইউজার ইন্টারঅ্যাকশনের জন্য একটি UseCase তৈরি করা হয়। উদাহরণস্বরূপ, একটি ইউজারের তথ্য নেওয়ার জন্য:

public class GetUserDataUseCase
{
    private readonly IUserRepository _userRepository;

    public GetUserDataUseCase(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public User Execute()
    {
        return _userRepository.GetUserData();
    }
}

Step 4: ViewModel (Application)

এখন, ViewModel তৈরি করা হবে যা Use Case এর মাধ্যমে ডেটা এবং লজিক View এর মধ্যে সঠিকভাবে ব্যাখ্যা করবে।

public class UserViewModel : INotifyPropertyChanged
{
    private readonly GetUserDataUseCase _getUserDataUseCase;
    private User _user;

    public User User
    {
        get => _user;
        set
        {
            _user = value;
            OnPropertyChanged(nameof(User));
        }
    }

    public UserViewModel(GetUserDataUseCase getUserDataUseCase)
    {
        _getUserDataUseCase = getUserDataUseCase;
    }

    public void LoadUserData()
    {
        User = _getUserDataUseCase.Execute();
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Step 5: Views (UI)

এখন XAML পেজ তৈরি করা হবে যেখানে ViewModel এর মাধ্যমে ডেটা এবং ইউজারের ইন্টারঅ্যাকশন পরিচালিত হবে।

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:YourAppNamespace"
             x:Class="YourAppNamespace.UserPage">

    <Label Text="{Binding User.Name}" />
    <Label Text="{Binding User.Email}" />
    <Button Text="Load Data" Command="{Binding LoadUserCommand}" />
</ContentPage>

এখানে, User.Name এবং User.Email ViewModel থেকে ব্যাখ্যা করা হবে এবং LoadUserCommand কমান্ডের মাধ্যমে ইউজার ডেটা লোড করা হবে।


Step 6: Dependency Injection (DI)

ডিপেনডেন্সি ইনজেকশনের মাধ্যমে ViewModel, UseCase এবং Repository এর মধ্যে যোগাযোগ স্থাপন করা হবে। এটি App.xaml.cs-এ করতে হবে:

public partial class App : Application
{
    public App()
    {
        InitializeComponent();

        // Dependency Injection
        var container = new Container();
        container.Register<IUserRepository, UserRepository>();
        container.Register<GetUserDataUseCase>();
        container.Register<UserViewModel>();

        var viewModel = container.Resolve<UserViewModel>();

        MainPage = new UserPage
        {
            BindingContext = viewModel
        };
    }
}

সারাংশ:

MVVM এবং Clean Architecture এর মাধ্যমে .NET MAUI অ্যাপ্লিকেশন তৈরি করা একটি শক্তিশালী এবং পরিস্কার আর্কিটেকচার প্রদান করে, যা কোড পুনঃব্যবহারযোগ্যতা, পরীক্ষণ, এবং রক্ষণাবেক্ষণকে সহজ করে তোলে। এখানে:

  • Core স্তরে ডোমেইন মডেল এবং লজিক।
  • Application স্তরে ViewModel এবং ইউজার ইন্টারঅ্যাকশন।
  • UI স্তরে XAML পেজ এবং ইউজারের ইন্টারফেস।

এই আর্কিটেকচারটি অ্যাপ্লিকেশনকে আরও স্কেলেবল, মডুলার এবং ভবিষ্যত পরিবর্তন সমর্থনযোগ্য করে তোলে।

Content added By
Promotion