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

时间:2018-05-31 02:17:08

标签: c# wpf entity-framework mvvm prism

C#,WPF,.NET Framework 4.5,EntityFramework,Prism

我的所有模型都是通过添加" ADO.NET实体数据模型"自动生成的。并从数据库中选择" Code First。"对模型没有任何更改,一切都在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.我有一个名为ErrorLog的SQL表和模型,我想捕获并保存所有错误:

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;

    }
}

问题是需要像在ViewModel中那样初始化上下文,因为errorLogContext在警告中唠叨它始终为null。我尝试将它添加到上述任何方法的构造函数中或创建公共应用程序(IErrorLog errorLogContext),我得到那里没有覆盖方法警告......所以...我应该在哪里设置我和#39; m缺失,以便我可以将Exceptions保存到我的数据库中?

1 个答案:

答案 0 :(得分:1)

为什么你必须处理后面的应用程序代码中的异常?

您可以在主窗口视图模型中执行此操作。我这样做,它工作正常。

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

                    DisplayAppropriateNotification(a);

                    a.Handled = true;
                };
            }

这就是我在MainWindowViewmodel的构造函数中所做的。

我猜您将在viewmodel中创建上下文。