在ABP项目中的WPF(一):添加 WPF 项目到 ABP 框架

创建 ABP 项目

ASP.NET Boilerplate 网站上创建一个 ASP.NET MVC 5.x的项目,如下图所示:

将下载后的解决方案解压缩后使用 Visual Studio 2019 打开,并 还原NuGet包

在解决方案中添加WPF项目

Acme.ContosoUniversity.Web 项目上鼠标右键 -> 属性 ,查看项目的 目标框架 的版本

Visual Studio 2019 的解决方案资源管理器中选中解决方案,鼠标右键 -> 添加 -> 新建项目

添加新项目 窗口中选择 WPF应用(.NET Framework) 模板,然后 下一步

配置新项目 窗口中输入 WPF 项目的名称为:Acme.ContosoUniversity.WPF,框架为:.NET Framework 4.6.1 (与前面查看的目标框架版本相同)

为WPF项目添加NuGet包

Acme.ContosoUniversity.WPF 项目上 鼠标右键 -> 管理NuGet程序包, 在打开的 NuGet包管理器 中搜索并添加以下包:

1、Abp

2、Abp.Castle.Log4Net

3、EntityFramework 6.2.0

4、Microsoft.Bcl

5、Microsoft.Bcl.Async

为WPF项目添加引用

Acme.ContosoUniversity.WPF 项目的 引用鼠标右键 -> 添加引用

引用管理器 的左窗格选择 项目, 在右窗格中选中 ApplicationCoreEntityFramework 三个项目,然后 确定

添加 log4net.config 配置文件

Acme.ContosoUniversity.WPF 项目上 鼠标右键 -> 添加 -> 新建项,模板选择 应用程序配置文件,输入文件名为:log4net.config

输入 log4net.config 文件的内容如以下代码所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" >
<file value="Logs/Logs.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10000KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
</layout>
</appender>
<root>
<appender-ref ref="RollingFileAppender" />
<level value="DEBUG" />
</root>
</log4net>

添加WPF项目模块类

Acme.ContosoUniversity.WPF 项目上 鼠标右键 -> 添加 -> ,输入类文件名为:ContosoUniversityWPFModule.cs,输入如以下所示代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using Abp.Modules;
using System.Reflection;

namespace Acme.ContosoUniversity.WPF
{
[DependsOn(typeof(ContosoUniversityDataModule), typeof(ContosoUniversityApplicationModule))]
public class ContosoUniversityWPFModule : AbpModule
{
public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
// base.Initialize();
}
}
}

编辑 App.xaml.cs 文件

打开文件 App.xaml.cs,修改为如以下所示代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using Abp;
using Abp.Castle.Logging.Log4Net;
using Castle.Facilities.Logging;
using System.Windows;

namespace Acme.ContosoUniversity.WPF
{
/// <summary>
/// App.xaml 的交互逻辑
/// </summary>
public partial class App : Application
{
private readonly AbpBootstrapper _bootstrapper;
private MainWindow _mainWindow;

public App()
{
_bootstrapper = AbpBootstrapper.Create<ContosoUniversityWPFModule>();
_bootstrapper.IocManager.IocContainer.AddFacility<LoggingFacility>(
f => f.UseAbpLog4Net().WithConfig("log4net.config"));
}

protected override void OnStartup(StartupEventArgs e)
{
_bootstrapper.Initialize();
_mainWindow = _bootstrapper.IocManager.Resolve<MainWindow>();
_mainWindow.Show();
// base.OnStartup(e);
}

protected override void OnExit(ExitEventArgs e)
{
_bootstrapper.IocManager.Release(_mainWindow);
_bootstrapper.Dispose();
// base.OnExit(e);
}
}
}

编辑 App.xaml 文件

打开 App.xaml 文件,其内容为以下所示代码:

1
2
3
4
5
6
7
8
9
<Application x:Class="Acme.ContosoUniversity.WPF.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Acme.ContosoUniversity.WPF"
StartupUri="MainWindow.xaml">
<Application.Resources>

</Application.Resources>
</Application>

将第5行的 StartupUri="MainWindow.xaml" 删除,否则运行程序时会打开两个 MainWindow 窗口。修改后代码如以下所示:

1
2
3
4
5
6
7
8
<Application x:Class="Acme.ContosoUniversity.WPF.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Acme.ContosoUniversity.WPF">
<Application.Resources>

</Application.Resources>
</Application>

修改 MainWindow.xaml.cs 文件

打开 MainWindow.xaml.cs 文件,找到以下行:

1
public partial class MainWindow : Window

将其修改为如下所示代码,并添加相应的名字空间引用:

1
public partial class MainWindow : Window, ISingletonDependency

修改后的完整代码,如以下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using Abp.Dependency;
using System.Windows;

namespace Acme.ContosoUniversity.WPF
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window, ISingletonDependency
{
public MainWindow()
{
InitializeComponent();
}
}
}

运行WPF程序

Acme.ContosoUniversity.WPF 设为启动项目,并运行。此时出现 未经处理的异常,显示找不到文件 Debug\log4net.config

解决办法:将 log4net.config 复制到 Debug 文件夹后,再次运行即可。