2016-04-12 3 views
0

В настоящее время я работаю над 2 приложениями, приложением .NET 2.0 winforms и UWP-приложением. Большинство классов разделяются в обоих приложениях.Как я могу использовать один и тот же интерфейс для асинхронных и синхронных методов?

У меня есть интерфейс под названием IDialogService, который имеет конкретный класс для .NET2 и еще один конкретный класс для UWP. IDialogService предоставляет метод, называемый ShowDialogYesNo(), который возвращает boolean в зависимости от того, что пользователь нажал.

Проблема заключается в том, что MessageDialog в UWP имеет метод ShowAsync вместо всего лишь синхронного метода Show. Поэтому я не смогу использовать одну и ту же подпись для показа MessageBox или MessageDialog.

Некоторые из классов, которые совместно используются обоими проектами, используют экземпляр IDialogService. Но поскольку версия диалогового окна просмотра UWP должна быть async, я не могу использовать метод ShowDialogYesNo() от IDialogService.

Мы используем инъекцию зависимостей для ввода экземпляра .NET2 или UWP в конструктор. Моя цель здесь не имеют другую базу кода для .NET2 и UWP.

Он будет отличаться только в конкретном классе реализации интерфейса для каждой платформы. Я также не хочу иметь кучу #if WINDOWS_UWP в моем коде, если это возможно.

Вот код:

public interface IDialogService 
    { 
    bool ShowDialogYesNo(); 
    } 

    public class DialogServiceNet2 : IDialogService 
    { 
    public bool ShowDialogYesNo() 
    { 
     var result = MessageBox.Show("DialogMessage", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly); 
     if (result == DialogResult.Yes) 
     return true; 
     return false; 
    } 
    } 


public class DialogServiceUwp : IDialogService 
    { 
    public bool ShowDialogYesNo() 
    { 
     //???? 
    } 
    } 

Этот класс первоначально в проекте .NET2 затем я добавил его в качестве ссылки на проект UWP. Так что это в основном тот же файл.

public class SomeSharedUtil 
    { 
    IDialogService _commonDialog; 
    public SomeSharedUtil(IDialogService commonDialog) 
    { 
     _commonDialog = commonDialog; 
    } 

    public bool AskUser() 
    { 
     return _commonDialog.ShowDialogYesNo(); 
    } 
    } 

ответ

4

Вы не можете. Для асинхронной операции требуется другой открытый API, чем синхронный метод. Вызывающему вызывающему абоненту нужно по-разному обращаться к синхронным и асинхронным операциям (если только это не метод пожара и забывания), поэтому два типа: не могут выполнить один и тот же контракт (интерфейс a.k.a.), если он синхронный и один только асинхронный.

+0

Вы правы, я просто пытаюсь удачи. Я бы предпочел использовать #if WINDOWS_UWP, если я действительно хочу иметь тот же код. – Lance