Показывать диалог из не-пользовательского интерфейса DLL - PullRequest
0 голосов
/ 13 мая 2019

Я создаю DLL, которая будет использоваться из wpf и других видов фреймворков (windows form, asp ...).По этой причине я не хочу использовать Messagebox.Какой лучший способ отправить уведомление от dll к приложению, и каждый решает способ показать сообщение пользователю (и ждать ответа от пользователя)?Кто-нибудь может помочь мне найти правильный путь?

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Если библиотека (.dll) не предназначена для работы только с определенным пользовательским интерфейсом, библиотека не должна «решать», как или если будут отображаться уведомления.Это разделение проблем.Если библиотека определила, что она должна показывать MessageBox, то вы не сможете использовать эту же библиотеку с веб-приложением или каким-либо сервисом вне поля зрения.

Вот два способа (не исчерпывающий)) что мы можем получить информацию из отдельной библиотеки, включая нашу собственную:

  1. Мы вызываем функцию, и библиотека возвращает ответ.Например, это может означать, что действие выполнено успешно или не выполнено.Библиотека не знает, из какого типа приложения она вызывается, и нужно ли кому-либо видеть ответ.Это только возвращает это.Ваше приложение может затем получить этот результат и отобразить сообщение.

  2. Класс в библиотеке вызывает событие, которое указывает, что что-то произошло.То же самое - он не знает, что даже слушает или что произойдет в результате.Это просто поднимает уведомление.Наше приложение определяет, что в ответ на это событие должно отображаться сообщение.

Когда наши библиотеки работают таким образом, их проще тестировать с помощью автоматических тестов, таких как юнит-тесты и интеграционные тесты.Легко написать тест, который проверяет, что вызов метода возвращает определенный результат.Гораздо сложнее проверить, появляется ли MessageBox.

И, как уже упоминалось, это повышает вероятность того, что мы сможем использовать больше нашего кода с различными типами пользовательских интерфейсов.По этим причинам полезно писать как можно больше нашего кода отдельно от любого пользовательского интерфейса, что означает отсутствие учета поведения ввода-вывода, характерного для одного типа пользовательского интерфейса.

0 голосов
/ 13 мая 2019

Вы можете выставить событие, на которое могут подписаться потребители.Вот общий порядок действий такого рода:

Вы можете создать свой собственный класс для переноса данных о событии:

public class NotificationEventArgs : EventArgs
{
    public NotificationEventArgs(string message)
    {
        Message = message;
    }
    public string Message { get; }
}

Затем вы создаете делегат для представления подписи.события:

public delegate void OnNotificationEventHandler(SomeClass sender, NotificationEventArgs args);

Ваш класс или классы могут затем представить этого делегата как событие:

public class SomeClass
{
    private OnNotificationEventHandler _notificationEventHandler;
    public event OnNotificationEventHandler OnNotification
    {
        add { _notificationEventHandler += value; }
        remove { _notificationEventHandler -= value; }
    }

    protected void RaiseNotificationEvent(NotificationEventArgs args)
    {
        _notificationEventHandler?.Invoke(this, args);
    }

    public void SomeMethod()
    {
        //Your class does something that requires consumer notification
        var args = new NotificationEventArgs("Something happened!");
        //Raise the event for the consumers who are listening (if any)
        RaiseNotificationEvent(args);
    }

}

Наконец, ваши потребляющие классы подпишутся на это событие:

SomeClass obj = new SomeClass();
obj.OnNotification += Obj_OnNotification;

private static void Obj_OnNotification(SomeClass sender, NotificationEventArgs args)
{
    //Handle the notification from the class here.
    Console.WriteLine(args.Message);
}

Общая идея заключается в том, что потребители вашего класса должны знать только, что что-то произошло, а также подробности того, что произошло.То, как это событие используется, обрабатывается или отображается, не является ответственностью вашего компонента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...