我們都知道.NET Core 3.0已經發布了第六個預覽版,我們也知道.NET Core 3.0現在已經支援建立WPF專案了,剛好今天在寫一個程式碼生成器的客戶端的時候用到了WPF,所以就把WPF建立以及使用IOC的過程記錄一下,希望能對大家有所幫助。當然文章例項我就以我曾閱讀過的一篇文章的示例程式碼來進行演示了。
作者:依樂祝
步驟
通過命令列建立wpf專案,當然你也可以通過vs2019來進行建立。具體的步驟就不演示了,當然,如果你還不會用vs2019建立專案,那麼請你右上角關閉網頁,省的煩心。
❯ mkdir WpfIoc ❯ cd WpfIoc ❯ dotnet.exe --version 3.0.100-preview6-012264 ❯ dotnet new wpf The template "WPF Application" was created successfully. Processing post-creation actions... Running 'dotnet restore' on C:\Users\laure\projects\WpfIoc\WpfIoc.csproj... Restore completed in 90.03 ms for C:\Users\laure\projects\WpfIoc\WpfIoc.csproj. Restore succeeded. ❯ dotnet build Microsoft (R) Build Engine version 16.1.54-preview+gd004974104 for .NET Core Copyright (C) Microsoft Corporation. All rights reserved. Restore completed in 19.92 ms for C:\Users\laure\projects\WpfIoc\WpfIoc.csproj. C:\Program Files\dotnet\sdk\3.0.100-preview6-012264\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.RuntimeIdentifierInference.targets(151,5): message NETSDK1057: You are using a preview version of .NET Core. See: https://aka.ms/dotnet-core-preview [C:\Users\laure\projects\WpfIoc\WpfIoc.csproj] WpfIoc -> C:\Users\laure\projects\WpfIoc\bin\Debug\netcoreapp3.0\WpfIoc.dll Build succeeded. 0 Warning(s) 0 Error(s) Time Elapsed 00:00:01.63
我們想要實現的是引導應用程式並在MainWindow的建構函式中注入一個服務,該服務將被呼叫以便在應用程式的主視窗上顯示一些文字。
我們首選要安裝下
Microsoft Extensions DependencyInjection
nuget包,當然你也可以通過下面的方式進行新增,不過最好還是通過nuget的方式引入最新的預覽版即可。<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <UseWPF>true</UseWPF> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.0.0-preview6.19304.6" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\StoneGenerate.Core\StoneGenerate.Core.csproj" /> </ItemGroup> </Project>
建立一個
ITextService
介面服務,這個介面將由依賴注入容器注入到MainWindow
類中進行使用。public interface ITextService { string GetText(); }
當然你還得建立一個
TextService
類來實現上面的介面。class TextService : ITextService { private string _text; public TextService(string text) { _text = text; } public string GetText() { return _text; } }
接下來在我們的入口
App.xaml.cs
檔案中配置我們的IOC容器,併入住我們的服務,相信做過.NET Core專案的你,對下面的程式碼應該都非常的熟悉,這裡就不過多的解釋了,省的浪費大家的寶貴時間。public App() { var serviceCollection = new ServiceCollection(); ConfigureServices(serviceCollection); _serviceProvider = serviceCollection.BuildServiceProvider(); } private void ConfigureServices(IServiceCollection services) { services.AddSingleton<ITextService>(provider => new TextService("Hi WPF .NET Core 3.0")); services.AddSingleton<MainWindow>(); }
接下來我們重寫一下
App.xaml.cs
的OnStartup
方法,解析出MainWindow
並show出來
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var main = serviceProvider.GetRequiredService<MainWindow>();
main.Show();
}
當然,這也就意味著你得移除App.xmal
中的啟動選項,程式碼如下:
<Application x:Class="wpfioc.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:wpfioc"
Startup="App_OnStartup">
<Application.Resources>
</Application.Resources>
</Application>
接下來我們修改一下
MainWindow
的xaml程式碼以便來顯示我們的文字資訊:<Window x:Class="WpfIoc.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfIoc" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="9*" /> <RowDefinition Height="1*" /> </Grid.RowDefinitions> <Label Name="Label" Content="Hello .NET Core!" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="40" /> </Grid> </Window>
當然,
MainWindow
的cs程式碼也要進行下調整,以便能夠接受IOC注入進來的方法。public partial class MainWindow : Window { public MainWindow(ITextService textService) { InitializeComponent(); Label.Content = textService.GetText(); } }
結果
相信上面的繁瑣的步驟你也都看完了,那麼接下來就是見證奇蹟的時刻了,睜開你的雙眼,奉上精美圖片一張:
如上圖所示:MainWindow
呼叫了IOC注入進來的TextService
服務並正確的顯示了文字。
謝天謝地,沒出bug,其實我想說,這張圖為了偷懶,我都是盜的,文末上原文連結。
https://laurentkempe.com/2019/04/18/WPF-and-IOC-on-NET-Core-3-0/
最後
最近事情比較多,都沒時間好好的分享文章了。當然,每當我閒下來的時候我就會對所學所用進行相應的總結後進行分享的。只是工作忙的原因,頻次越來越低而已。