2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
अस्मिन् लेखे WPF Gallery परियोजनायाः उपयोगेन निर्भरता-इञ्जेक्शनस्य सम्बन्धित-अवधारणाः ज्ञातुं शक्यते तथा च WPF मध्ये निर्भरता-इञ्जेक्शन् कथं कर्तव्यम् इति ज्ञातुं शक्यते ।
निर्भरता-इञ्जेक्शन् (DI) इति एकः डिजाइन-प्रतिमानः अस्ति यस्य उपयोगः नियन्त्रणस्य उल्टा (IoC) सिद्धान्तस्य कार्यान्वयनार्थं भवति । निर्भरता-इञ्जेक्शनस्य मुख्यं उद्देश्यं वस्तुनः निर्माणं वस्तुनां मध्ये आश्रयस्य प्रबन्धनं च वस्तुनः अन्तः बाह्यपात्रे अथवा ढाञ्चे स्थानान्तरयितुं भवति, तस्मात् कोडस्य परिपालनक्षमता, परीक्षणक्षमता, लचीलता च सुधरति
निर्भरता-इञ्जेक्शनस्य मूल-अवधारणा
आश्रयस्य इन्जेक्शनस्य प्रकाराः
कन्स्ट्रक्टर इन्जेक्शन: आश्रितं वस्तु वर्गस्य कन्स्ट्रक्टर् मार्गेण पारितं भवति ।
public class OrderService
{
private readonly IProductRepository _productRepository;
public OrderService(IProductRepository productRepository)
{
_productRepository = productRepository;
}
}
सम्पत्ति इन्जेक्शन: आश्रितवस्तूनि वर्गस्य सार्वजनिकगुणैः पारितानि भवन्ति।
public class OrderService
{
public IProductRepository ProductRepository { get; set; }
}
विधि इन्जेक्शन: आश्रितं वस्तु वर्गस्य मेथड् पैरामीटर् द्वारा पारितं भवति ।
public class OrderService
{
public void ProcessOrder(IProductRepository productRepository)
{
// 使用 productRepository 处理订单
}
}
निर्भरता-इञ्जेक्शन् (DI) एकः डिजाइन-प्रतिमानः अस्ति यस्य माध्यमेन वस्तुनां निर्माणं वस्तुनां मध्ये आश्रयस्य प्रबन्धनं च वस्तुनः अन्तः बाह्यपात्रे अथवा ढाञ्चे स्थानान्तरितुं शक्यते आश्रयस्य इन्जेक्शनस्य अनेकाः महत्त्वपूर्णाः कारणानि लाभाः च सन्ति : १.
अयं लेखः WPF Code address इत्यस्मिन् dependency injection इत्यस्य उपयोगं ज्ञातुं WPF Gallery परियोजनायाः उपयोगं करोति ।
https://github.com/microsoft/WPF-नमूना/blob/main/नमूनाअनुप्रयोग/WPFGallery
अस्मिन् परियोजनायां निर्भरता-इञ्जेक्शनं कार्यान्वितुं एतयोः संकुलयोः उपयोगः भवति ।
प्रथमं App.xaml.cs इत्यस्य सामग्रीं पश्यन्तु:
public partial class App : Application
{
private static readonly IHost _host = Host.CreateDefaultBuilder()
.ConfigureServices((context, services) =>
{
services.AddSingleton<INavigationService, NavigationService>();
services.AddSingleton<MainWindow>();
services.AddSingleton<MainWindowViewModel>();
services.AddTransient<DashboardPage>();
services.AddTransient<DashboardPageViewModel>();
services.AddTransient<ButtonPage>();
services.AddTransient<ButtonPageViewModel>();
services.AddTransient<CheckBoxPage>();
services.AddTransient<CheckBoxPageViewModel>();
services.AddTransient<ComboBoxPage>();
services.AddTransient<ComboBoxPageViewModel>();
services.AddTransient<RadioButtonPage>();
services.AddTransient<RadioButtonPageViewModel>();
services.AddTransient<SliderPage>();
services.AddTransient<SliderPageViewModel>();
services.AddTransient<CalendarPage>();
services.AddTransient<CalendarPageViewModel>();
services.AddTransient<DatePickerPage>();
services.AddTransient<DatePickerPageViewModel>();
services.AddTransient<TabControlPage>();
services.AddTransient<TabControlPageViewModel>();
services.AddTransient<ProgressBarPage>();
services.AddTransient<ProgressBarPageViewModel>();
services.AddTransient<MenuPage>();
services.AddTransient<MenuPageViewModel>();
services.AddTransient<ToolTipPage>();
services.AddTransient<ToolTipPageViewModel>();
services.AddTransient<CanvasPage>();
services.AddTransient<CanvasPageViewModel>();
services.AddTransient<ExpanderPage>();
services.AddTransient<ExpanderPageViewModel>();
services.AddTransient<ImagePage>();
services.AddTransient<ImagePageViewModel>();
services.AddTransient<DataGridPage>();
services.AddTransient<DataGridPageViewModel>();
services.AddTransient<ListBoxPage>();
services.AddTransient<ListBoxPageViewModel>();
services.AddTransient<ListViewPage>();
services.AddTransient<ListViewPageViewModel>();
services.AddTransient<TreeViewPage>();
services.AddTransient<TreeViewPageViewModel>();
services.AddTransient<LabelPage>();
services.AddTransient<LabelPageViewModel>();
services.AddTransient<TextBoxPage>();
services.AddTransient<TextBoxPageViewModel>();
services.AddTransient<TextBlockPage>();
services.AddTransient<TextBlockPageViewModel>();
services.AddTransient<RichTextEditPage>();
services.AddTransient<RichTextEditPageViewModel>();
services.AddTransient<PasswordBoxPage>();
services.AddTransient<PasswordBoxPageViewModel>();
services.AddTransient<ColorsPage>();
services.AddTransient<ColorsPageViewModel>();
services.AddTransient<LayoutPage>();
services.AddTransient<LayoutPageViewModel>();
services.AddTransient<AllSamplesPage>();
services.AddTransient<AllSamplesPageViewModel>();
services.AddTransient<BasicInputPage>();
services.AddTransient<BasicInputPageViewModel>();
services.AddTransient<CollectionsPage>();
services.AddTransient<CollectionsPageViewModel>();
services.AddTransient<MediaPage>();
services.AddTransient<MediaPageViewModel>();
services.AddTransient<NavigationPage>();
services.AddTransient<NavigationPageViewModel>();
services.AddTransient<TextPage>();
services.AddTransient<TextPageViewModel>();
services.AddTransient<DateAndTimePage>();
services.AddTransient<DateAndTimePageViewModel>();
services.AddTransient<StatusAndInfoPage>();
services.AddTransient<StatusAndInfoPageViewModel>();
services.AddTransient<SamplesPage>();
services.AddTransient<SamplesPageViewModel>();
services.AddTransient<DesignGuidancePage>();
services.AddTransient<DesignGuidancePageViewModel>();
services.AddTransient<UserDashboardPage>();
services.AddTransient<UserDashboardPageViewModel>();
services.AddTransient<TypographyPage>();
services.AddTransient<TypographyPageViewModel>();
services.AddSingleton<IconsPage>();
services.AddSingleton<IconsPageViewModel>();
services.AddSingleton<SettingsPage>();
services.AddSingleton<SettingsPageViewModel>();
services.AddSingleton<AboutPage>();
services.AddSingleton<AboutPageViewModel>();
}).Build();
[STAThread]
public static void Main()
{
_host.Start();
App app = new();
app.InitializeComponent();
app.MainWindow = _host.Services.GetRequiredService<MainWindow>();
app.MainWindow.Visibility = Visibility.Visible;
app.Run();
}
}
IHost इति किम् ?
C# इत्यस्मिन्, .IHost
इति एकं अन्तरफलकं यत् .NET मध्ये अनुप्रयोगानाम् निर्माणाय विन्यस्तीकरणाय च उपयुज्यतेHost
अवधारणा अमूर्त।IHost
अन्तरफलकं अनुप्रयोगस्य आरम्भं, चालनं, प्रबन्धनं च कर्तुं आवश्यकानां सेवानां घटकानां च संग्रहं परिभाषयति । सामान्यतया ASP.NET Core अनुप्रयोगैः सह उपयुज्यते, परन्तु अन्यप्रकारस्य .NET अनुप्रयोगैः सह अपि कार्यं करोति, यथा कन्सोल् अनुप्रयोगैः अथवा WPF कार्यक्रमैः सह ।
IHost
अन्तरफलकं भवतिHostBuilder
वर्ग कार्यान्वयनम्, यत् निर्माणं विन्यासं च प्रदातिIHost
उदाहरणविधयः ।HostBuilder
भवन्तं लॉगिंग्, विन्यासः, निर्भरता-इञ्जेक्शन्-पात्रम् इत्यादीनि विविधानि सेवानि योजयितुं, स्वस्य अनुप्रयोगस्य आरम्भ-विराम-व्यवहारं च विन्यस्तुं च अनुमन्यते
पूर्वविन्यस्तपूर्वनिर्धारितैः सह Microsoft.Extensions.Hosting.IHostBuilder उदाहरणानि निर्मातुं सुविधाविधयः प्रदाति ।
एकं IHostBuilder प्रत्यागच्छति ।
पात्रे सेवाः योजयन्तु। एतत् क्रिया बहुवारं आह्वयितुं शक्यते तस्य परिणामाः च सञ्चिताः भवन्ति ।
configureDelegate इति पैरामीटर् इत्यस्य अर्थः Microsoft.Extensions.DependencyInjection.ISViceCollection इत्यस्य प्रतिनिधिं विन्यस्तुं भवति ।
एतत् संग्रहं System.ISViceProvider इत्यस्य निर्माणार्थं उपयुज्यते ।
प्रतिनिधिस्य कृते द्वौ पैरामीटर् प्रकारौ आवश्यकौ: HostBuilderContext तथा IServiceCollection, येषां रिटर्न् मूल्यं नास्ति ।
अत्र प्रतिनिधिप्रकारं पूरयति इति Lambda व्यञ्जनं पारितं भवति ।
C# इत्यस्मिन्, .() => {}
लम्ब्डा-व्यञ्जनानां कृते वाक्यविन्यासः अस्ति । Lambda expressions एकः लघुः प्रतिनिधि-वेष्टकः अस्ति यः भवन्तं अनामिकं विधिं परिभाषितुं शक्नोति तथा च प्रतिनिधिषु अथवा अभिव्यक्तिवृक्षान् समर्थयति इति विधिं प्रति पैरामीटर् रूपेण पारयितुं शक्नोति
लैम्ब्डा-अभिव्यक्तयः विधि-परिभाषायाः संक्षिप्तं मार्गं प्रददति, तथा च ते विशेषतया तदा उपयोगिनो भवन्ति यदा भवद्भिः अन्य-विधिषु मेथड्-रूपेण पैरामीटर्-रूपेण पारयितुं आवश्यकता भवति ।
सेवां योजयन्ते सति अत्र द्वौ जीवनचक्रौ स्तः, AddSingleton तथा AddTransient इत्येतयोः अतिरिक्तं AddScoped अपि अस्ति ।
एतानि पद्धतयः सेवायाः जीवनचक्रं परिभाषयन्ति, अर्थात् अनुप्रयोगे सेवादृष्टान्ताः कथं निर्मीयन्ते, प्रबन्ध्यन्ते च ।
AddSingleton इति
AddTransient इति
AddScoped इति
एतासां सेवानां उपयोगं कुर्वन्तु
मुख्यकार्य्ये : १.
start up इति_host
,उत्तीर्णः_host.Services.GetRequiredService<MainWindow>();
MainWindow उदाहरणं प्राप्नुवन्तु ।
MainWindow वर्गं उदाहरणरूपेण गृहीत्वा MainWindow.xaml.cs मध्ये MainWindow इत्यस्य कन्स्ट्रक्टर् पश्यन्तु:
public MainWindow(MainWindowViewModel viewModel, IServiceProvider serviceProvider, INavigationService navigationService)
{
_serviceProvider = serviceProvider;
ViewModel = viewModel;
DataContext = this;
InitializeComponent();
Toggle_TitleButtonVisibility();
_navigationService = navigationService;
_navigationService.Navigating += OnNavigating;
_navigationService.SetFrame(this.RootContentFrame);
_navigationService.Navigate(typeof(DashboardPage));
WindowChrome.SetWindowChrome(
this,
new WindowChrome
{
CaptionHeight = 50,
CornerRadius = default,
GlassFrameThickness = new Thickness(-1),
ResizeBorderThickness = ResizeMode == ResizeMode.NoResize ? default : new Thickness(4),
UseAeroCaptionButtons = true
}
);
this.StateChanged += MainWindow_StateChanged;
}
अस्मिन् विषये अप्रासंगिकं सामग्रीं निष्कास्य यथा भवति ।
public MainWindow(MainWindowViewModel viewModel, IServiceProvider serviceProvider, INavigationService navigationService)
{
_serviceProvider = serviceProvider;
ViewModel = viewModel;
_navigationService = navigationService;
}
किं भवता अवलोकितं यत् भवता एतानि वस्तुनि स्वयमेव नवीनीकरणस्य आवश्यकता नास्ति?
यदि निर्भरता-इञ्जेक्शनस्य उपयोगः न भवति तर्हि एतत् एतादृशं दृश्यते ।
public MainWindow()
{
_serviceProvider = new IServiceProvider();
ViewModel = new MainWindowViewModel();
_navigationService = new INavigationService();
}
अस्मिन् लेखे प्रथमं निर्भरता-इञ्जेक्शनस्य अवधारणायाः परिचयः कृतः, ततः निर्भरता-इञ्जेक्शनस्य आवश्यकता किमर्थम् इति व्याख्यायते, अन्ते च WPF Gallery परियोजनायाः माध्यमेन WPF मध्ये निर्भरता-इञ्जेक्शनस्य उपयोगः कथं करणीयः इति ज्ञायते
1、[WPF-नमूना/नमूना अनुप्रयोग/WPFGallery at main · microsoft/WPF-नमूना (github.com)](https://github.com/microsoft/WPF-नमूना/tree/main/नमूना अनुप्रयोग/WPFGallery)