2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Hic articulus utitur WPF Gallery ad iniectionem conceptus notiones dependentiae discendi injectiones et quomodo dependentiam iniectio in WPF praestare.
Dependentia Iniectio (DI) est forma designativa adhibita ad inversionem imperii (IoC) principium. Praecipuum propositum dependentiae iniectio est ad creationem obiectorum et administrationem dependentiarum inter obiecta ab intra obiecto transferendi ad vas externum seu compagem, eoque meliori codicis conservabilitatem, testabilitatis et flexibilitatem.
Core conceptio dependentiae iniectio
Genera dependentiae iniectio
conditor iniectio: The dependent object per fabricatorem classis transivit.
public class OrderService
{
private readonly IProductRepository _productRepository;
public OrderService(IProductRepository productRepository)
{
_productRepository = productRepository;
}
}
Res iniectio: Dependentes res publicas classium proprietates trajiciunt.
public class OrderService
{
public IProductRepository ProductRepository { get; set; }
}
modum iniectio: Dependens objectum per modum parametri classis.
public class OrderService
{
public void ProcessOrder(IProductRepository productRepository)
{
// 使用 productRepository 处理订单
}
}
Dependentia Iniectio (DI) est forma designativa per quam creatio obiectorum et administratio clientium inter obiecta transferri possunt ab obiecto ad externum continens seu compagem. Plures rationes et commoda dependentiae iniectio momenti sunt;
Hic articulus utitur WPF Gallery project ad discendum quomodo dependentia iniectio in WPF utatur.
https://github.com/microsoft/WPF-Samples/blob/main/SampleApplications/WPFGallery
Ad dependentiam iniectio in hoc incepto deducendi, hae duae fasciculi adhibentur:
Primum vide contenta 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();
}
}
Quid est IHost?
In C#,IHost
est interface quod in .NET facere et configurare applicationsHost
notio abstracta.IHost
Interfacius definit collectionem officiorum et partium quae ad applicationem incipere, currere et administrare. Cum applicationibus Core ASP.NET typice adhibetur, sed etiam cum aliis applicationibus NET genera laborat, ut applicationes consolatoriae vel programmata WPF.
IHost
Interface estHostBuilder
Classis exsecutio, quae creationem et configurationem praebetIHost
modi instantia.HostBuilder
Permittit tibi varia officia addere, sicut logging, configuratione, dependentiam iniectio vasis, etc., et configurare initium ac finem agendi applicationis tuae.
Commodum rationes praebet ad Microsoft.Extensions.Hosting.IHostBuilder instantiae creandi cum defaltis praefiguratis.
IHostBuilder refert an.
continens operas add. Haec operatio potest dici multiplex tempora et effectus eius cumulativus.
Sensus parametri configureDelegati est delegatum Microsoft.Extensions configurare. DependencyInjection.IServiceCollection.
Haec collectio ad fabricam System.IServiceProvider adhibebitur.
Delegatus duas species moduli requirit: HostBuilderContext et IServiceCollection, quae valorem nullum habent.
Expressio Labda quae typo delegato satisfacit huc transigitur.
In C#,() => {}
Ia syntaxin est locutionum in Labda. Expressiones Labda sunt leve pondus delegatus fasciculus qui permittit te methodum anonymum definire et eam ut modulum ad methodum quae delegatis vel expressionibus arboribus sustinet.
Labda locutiones brevem methodum ad methodos definiendas praebent, utiles praesertim cum methodos ad alios modos parametri transire debes.
Cum officia additis, duo cycli vitae hic sunt, praeter AddSingleton et AddTransient, additur etiam AddScoped.
Hae modi definiunt vitam cycli muneris, id est, quomodo operae instantiae creantur et in applicatione conficiantur.
AddSingleton
AddTransient
AddScoped
uti haec officia
Praecipuum munus:
Start up_host
, pass_host.Services.GetRequiredService<MainWindow>();
Adepto MainWindow exempli gratia.
Classis MainWindow exemplum sumens, conditorem MainWindow in MainWindow.xaml.cs spectare:
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;
}
Sublata materia ad hunc locum talis est:
public MainWindow(MainWindowViewModel viewModel, IServiceProvider serviceProvider, INavigationService navigationService)
{
_serviceProvider = serviceProvider;
ViewModel = viewModel;
_navigationService = navigationService;
}
Animadvertisne tibi iam non opus esse novis istis rebus te?
Si dependentia iniectio non adhibeatur, videre licet hoc:
public MainWindow()
{
_serviceProvider = new IServiceProvider();
ViewModel = new MainWindowViewModel();
_navigationService = new INavigationService();
}
Hic articulus primum notionem dependentiae injectionis introducit, deinde explicatur cur dependentia iniectio opus sit, ac demum dependens injectione in WPF per WPF Gallery project uti discat.
1、[WPF-Samples/Sample Applications/WPFGallery ad principale · microsoft/WPF-Samples (github.com)] (https://github.com/microsoft/WPF-Samples/tree/main/Sample Applications/WPFGallery)