接管WPF应用启动过程

时间:2015-07-01 19:13:13

标签: wpf bootstrapping

我有一个当前存在于我的WPF项目中的引导类。它设置了我的Autofac依赖项和我的一些抽象工厂方法。此引导类不是与Prism / Unity中使用的相同的引导程序。

我想做的是稍微清理我的依赖图。

Dependency Graph

我可以通过删除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应用程序的启动过程?

1 个答案:

答案 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();
        }
    }
}