Как выполнить асинхронный метод внутри абстрактного класса из другого метода обратного вызова в другом классе - PullRequest
0 голосов
/ 07 января 2019

У меня есть конкретный вызов класса AncSubscriberWrapper, и у него есть метод обратного вызова

    public Task OnUnshownCounterUpdatedAsync(long counter)
    {
        return Task.CompletedTask;
    }

а также у меня есть вызов абстрактного класса BasePageViewModel, и у него есть асинхронный метод

    protected async void GetUnseenNotificationsCount()
    {
        UnseenNotificationCount  = await m_ancSubscriberWrapper.TryGetNotificationCountAsync(NotificationStatus.Delivered | NotificationStatus.Created);
    }

Пути классов, как показано ниже внутри проекта.

. / SRC / Visit.Common / Услуги / AncSubscriberWrapper.cs ./src/Visit.Common/ViewModels/PageViewModels/BasePageViewModel.cs

Мне нужно выполнить метод GetUnseenNotificationsCount () из метода OnUnshownCounterUpdatedAsync ().

Как я могу это сделать?

1 Ответ

0 голосов
/ 07 января 2019

Это один из способов, которым я смог достичь своей цели. Я не уверен, что это правильный способ сделать это.

Как я достиг своей цели, используя EventHandler.

Создание интерфейса (IAncSubscriberWrapper) для класса AncSubscriberWrapper

public interface IAncSubscriberWrapper
{
    event EventHandler UnshownNotificationCounterUpdated;
}

и реализует его как показано ниже

public class AncSubscriberWrapper : NotificationCenterFacade, IAncSubscriberWrapper

Затем реализуйте элемент интерфейса внутри класса AncSubscriberWrapper

public event EventHandler UnshownNotificationCounterUpdated;

, а также вызывать метод внутри метода OnUnshownCounterUpdatedAsync

public Task OnUnshownCounterUpdatedAsync(long counter)
{
    UnshownNotificationCounterUpdated?.Invoke(this, null);
    return Task.CompletedTask;
}

Затем перейдите в BasePageViewModel, зарегистрируйте и отмените регистрацию слушателей.

public void Initialize()
{
    m_ancSubscriberWrapper.UnshownNotificationCounterUpdated += OnUnshownNotificationCounterUpdated;
}

public void Teardown()
{
    m_ancSubscriberWrapper.UnshownNotificationCounterUpdated -= OnUnshownNotificationCounterUpdated;
}

Поскольку BasePageViewModel является абстрактным классом, который когда-либо конкретный класс, который его использует, будет переопределять методы. (Следующий фрагмент кода не имеет прямого отношения к этому вопросу, но для понимания дизайна на основе моего кода)

/*
* BaseContainerViewController is only accepting TPageViewModel generic type of classes only.
* TPageViewModel inherits BasePageViewModel and BaseContainerViewController inherits BaseViewController
* That's what following line is all about
*/

public abstract class BaseContainerViewController<TPageViewModel> : BaseViewController where TPageViewModel : BasePageViewModel

и

public class WardListViewController : BaseContainerViewController<WardListPageViewModel>

Вернуться к заключительной части ответа. Добавьте следующий метод в класс BasePageViewModel, и он завершит процесс.

protected virtual void OnUnshownNotificationCounterUpdated(object sender, EventArgs eventArgs) 
{
    GetUnseenNotificationsCount();
}
...