WPF MVVM перехватывает глобальный обработчик исключений в контексте - PullRequest
0 голосов
/ 31 мая 2018

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

Все мои модели были автоматически сгенерированы путем добавления «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 с именем 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 скулил в предупреждениях.что это всегда будет нулевым.Я пытаюсь добавить его в конструктор любого из вышеперечисленных методов или создать общедоступное приложение (IErrorLog errorLogContext), и я получаю, что нет предупреждений метода переопределения ... Итак ... где я должен поместить настройки, которые мне не хватает, такчто я могу сохранить исключения в моей базе данных?

1 Ответ

0 голосов
/ 31 мая 2018

Почему вы должны обрабатывать исключения в коде приложений позади?

Вы можете сделать это в своей модели окна основного окна.Я делаю это, и это работает нормально.

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

                    DisplayAppropriateNotification(a);

                    a.Handled = true;
                };
            }

Это то, что я делаю в конструкторе моей MainWindowViewmodel.

Полагаю, у вас будет контекст, созданный в модели представления.

...