WPF MVVM 捕获全局异常处理程序到上下文

WPF MVVM Capture Global Exception Handler to Context

C#、WPF、.NET Framework 4.5、EntityFramework、棱镜

我的所有模型都是通过添加 "ADO.NET Entity Data Model" 并选择 "Code First from Database." 自动生成的。模型没有任何变化,一切都在 ViewModels 中处理。然后我创建了 IModel 类 包含:

ICollection<Model> GetEntities();
void CreateEntity(Model entity);

然后我创建了服务 类,如 ModelService,充实了上述方法并实现了 IDisposable。然后 ViewModels 使用以上所有内容:

public IModel modelContext;
public ICollection<Model> Models; { get; private set;}

public ViewModel(IModel modelContext)
{
    Models = new ObservableCollection<Model>();
    this.modelContext = modelContext;
}

以上所有都很好用...除了 App.xaml.cs...这就是我要做的。我通过将以下内容添加到 App.xaml(不是 cs)来实现全局异常处理:

<Application DispatcherUnhandledException="Application_DispatcherUnhandledException">

那么,这里是所有App.xaml.cs。我有一个 SQL table 和一个名为 ErrorLog 的模型,我想在其中捕获并保存所有错误:

public partial class App : Application
{
    private readonly string user = Environment.UserName;
    private IErrorLog errorLogContext;

    protected override void OnStartup(StartupEventArgs e)
    {            
        base.OnStartup(e);

        var bootstrapper = new Bootstrapper();
        bootstrapper.Run();
    }

    private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    {
        var errorLog = new ErrorLog
        {
            Message = e.Exception.Message,
            DateTime = DateTime.Now,
            User = user,
            Location = "Global Exception Handler"
        };

        errorLogContext.CreateEntity(errorLog);            

        MessageBox.Show("An unhandled exception just occurred: " + e.Exception.Message, "App Title", MessageBoxButton.OK, MessageBoxImage.Warning);
        e.Handled = true;

    }
}

问题是上下文需要像在 ViewModels 中那样初始化,正如 errorLogContext 在警告中抱怨它始终为 null 一样。我尝试将它添加到上述任何方法的构造函数或创建 public App(IErrorLog errorLogContext) 并且我发现没有覆盖方法警告......所以......我应该把我的设置放在哪里丢失以便我可以将异常保存到我的数据库中?

为什么一定要处理后台代码中的异常?

您可以在主 window 视图模型中执行此操作。我正在这样做并且工作正常。

if (Application.Current != null)
            {
                Application.Current.DispatcherUnhandledException += (s, a) =>
                {
                    Reporter.AddLog(a.Exception);

                    DisplayAppropriateNotification(a);

                    a.Handled = true;
                };
            }

这就是我在 MainWindowView 模型的构造函数中所做的。

我想您会在视图模型中创建上下文。