独立于UI框架开发

时间:2012-01-27 22:26:59

标签: c#

我正在尝试灵活地组织我的代码。所以我的应用程序大量使用接口。在我的控制器类中,我想在视图中的某个控件上启动网络摄像头预览。 ClientView和WebcamPreview的实现相互依赖。因此,WinForms有一个特定的WebcamPreview,WPF有一个。我以两种可能的方式结束了:

选项1:

优点:泛型

缺点:通用声明冒泡到顶级控制器类,我需要在其中声明至少3个泛型。 (也许我做错了什么?)

interface IClientView<TSelf>
{
    TSelf SelfControl { get; }
}

interface IWebcamPreview<TSelf>
{
    void Start(TSelf selfControl);
}

选项2:

优点:避免使用更多仿制药

缺点:指令;将为WPF和WinForms编译不同的程序集

interface IClientView
{
#if WPF
    ControlBase SelfControl { get; }
#else // WinForms
    PictureBox SelfControl { get; }
#endif
}

interface IWebcamPreview
{
    // analog
}

那么如何组织我的代码以支持不同的UI框架呢?

2 个答案:

答案 0 :(得分:2)

选项3:

abstract class AbstractControl { }

class WinFormsControl : AbstractControl { }

class WpfControl : AbstractControl { }

interface IClientView
{
   AbstractControl SelfControl { get; }
}

答案 1 :(得分:1)

选项1是要走的路。选项2将非常快速地使用指令。如果有一天,除了WPF和Winform之外,你发现自己必须为Windows Phone和Web应用程序做,你必须触摸大量代码来添加新的#elif指令。在这一点上,代码不会太令人愉快。使用选项1和一些好的组织,即WPF进入1个程序集,Winform另一个,未来的添加,例如Windows Phone可能不需要重新编译现有代码。如果是这样,可能非常小。