接管WPF应用程序启动过程

接管WPF应用程序启动过程,wpf,bootstrapping,Wpf,Bootstrapping,我有一个引导类,它当前存在于我的WPF项目中。它设置了我的Autofac依赖项和我的一些抽象工厂方法。此引导类与Prism/Unity中使用的引导类不同 我想做的是清理一下我的依赖关系图 我可以通过删除Pen.Apps.Desktop.exe在所有其他程序集上的依赖项来清除很多这方面的问题。这些依赖关系是由于该项目中发生的DI设置而存在的。相反,我想将该设置重构到一个名为App.Bootstrap的独立项目中。App.Bootstrap项目将引用所有依赖项,设置DI,然后启动.App.Desk

我有一个引导类,它当前存在于我的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.Run(newmainwindow())因为我的app.xaml.cs中有一些东西需要运行(并且应该留在那里)

我看到的另一个选择是将
引导程序
类设置为静态,并实现一个简单的发布/订阅系统。让app.xaml.cs与app.xaml.cs实例一起发布,引导类接收它。然后,引导类可以设置DI并在完成时回调到app.xaml.cs。这是一种选择;如果可以的话,我正在寻找一种更紧密的结合


以前有人这样做过,或者对我如何接管WPF应用程序的启动过程有想法吗?

你能避免在
应用程序
课程中依赖DI吗?如果答案大多为“是”,则可以覆盖在构建主窗口之前调用并返回的
OnStartup()
。只要您在之前没有构建或做任何依赖于DI的事情,那么您应该是好的。请注意,这取决于框架中的执行顺序,因此很明显,将来可能会发生变化(但我想可能不会)

侧栏: 引导程序实际上可以创建
应用程序
类的一个实例,并在其上调用
运行()
新建应用程序().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();
        }
    }
}

有趣的是,当我执行
newapp()
时,唯一可用的方法就是
InitializeComponent
。您是从不同的程序集执行此操作的吗?我的问题是循环引用。我的引导程序集需要引用桌面项目中的类,因此桌面项目无法调用引导程序项目来告诉它我正在启动。这都在一个程序集内,.NET 4.5,VS 2013。我的
App
继承自
System.Windows.Application
。WPF应用程序通常从
Application.Run()
——您可以看到,如果覆盖
OnStartup()
并在那里设置断点,请检查调用堆栈。啊,好的。我想打破两个不同的集会