我目前正在开发2个应用程序,一个.NET 2.0 winforms应用程序和一个UWP应用程序。大多数类都在两个应用程序中共享。
我有一个名为IDialogService
的接口,它有一个特定于.NET2的具体类和另一个UWP的具体类。 IDialogService
公开了一个名为ShowDialogYesNo()
的方法,该方法根据用户点击的内容返回boolean
。
问题在于,UWP中的MessageDialog
采用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();
}
}
答案 0 :(得分:4)
你做不到。异步操作需要与同步方法不同的公共API。 调用者需要以不同的方式调用同步和异步操作(除非它是一个fire and forget方法)所以两个类型不能完成相同的契约(也就是接口),如果一个是只有同步,一个只是异步。