我有一个当前存在于我的WPF项目中的引导类。它设置了我的Autofac依赖项和我的一些抽象工厂方法。此引导类不是与Prism / Unity中使用的相同的引导程序。
我想做的是稍微清理我的依赖图。
我可以通过删除Pen.Apps.Desktop.exe
对所有其他程序集的依赖关系来清理大量内容。由于在该项目中进行了DI设置,因此存在这些依赖关系。相反,我想将该设置重构为一个名为App.Bootstrap的独立项目。 App.Bootstrap
项目将引用所有依赖项,设置DI,然后启动.App.Desktop
。这样,App.Desktop
只依赖于三个库,我的域,我的演示文稿和我的服务接口项目。
我之前在WinForms中已经完成了这个,只是在一个项目中有一个主方法从另一个项目中旋转一个表单。然而,在WPF中,它似乎有点棘手。我需要运行子类应用程序(app.xaml.cs);我似乎无法找到任何办法。
public class Bootstrapper
{
static Form mainWindow;
[STAThread]
static void Main()
{
var penApp = new Pen.Apps.Desktop.App();
}
}
penApp
实例只有一个公共方法InitializeComponent
。静态Run()
类上找到的Application
方法似乎不存在。我不想只做Application.Run(new MainWindow());
,因为我的app.xaml.cs中有需要运行的东西(应该留在那里)。
我看过的另一个选择是使Bootstrapper
类保持静态,并实现一个简单的pub / sub系统。让app.xaml.cs与app.xaml.cs实例一起发布,bootstrap类接收它。然后,bootstrap类可以在完成后设置DI并回调到app.xaml.cs。这是一个选择;如果可以的话,我正在寻找更紧密耦合的东西。
之前有人这样做了,或者知道如何接管WPF应用程序的启动过程?
答案 0 :(得分:1)
你可以避免依赖App
班级的DI吗?如果答案主要是“是”,您可以覆盖被调用的OnStartup()
并在构建主窗口之前返回。只要你没有构建或做任何依赖于DI的事情,那么你应该是好的。请注意,这取决于框架中的执行顺序,因此显然可能会在将来改变您(但我可能不会这样做)。
侧栏:
引导程序实际上可以创建App
类的实例并在其上调用Run()
(new App().Run()
),因为它看起来就像是正常情况一样....
<强>更新强> 你走了,这个有效。我是在同一个组件中完成的,但是你的引导程序可能在它自己的组件中;务必将项目指向项目设置“应用程序”页面上的自定义入口点。
using System;
namespace TryStartup
{
public class Bootstrapper
{
[STAThread]
static void Main()
{
// Your initialization code here...
var app = new TryStartup.App();
app.InitializeComponent();
app.Run();
}
}
}