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保存到我的数据库中?
答案 0 :(得分:1)
为什么你必须处理后面的应用程序代码中的异常?
您可以在主窗口视图模型中执行此操作。我这样做,它工作正常。
if (Application.Current != null)
{
Application.Current.DispatcherUnhandledException += (s, a) =>
{
Reporter.AddLog(a.Exception);
DisplayAppropriateNotification(a);
a.Handled = true;
};
}
这就是我在MainWindowViewmodel的构造函数中所做的。
我猜您将在viewmodel中创建上下文。