0

我有一个项目,其中包含一个在图表上绘制的类。该课程如下所示:-

using System.Web.UI.DataVisualization.Charting;

namespace MyNameSpace
{
    public static class Utilities
    {
        public static void DrawOnGraph (Chart ourChart,
                                        // ...more parameters...
                                        )
        {
            ChartArea our_area = new ChartArea("Main");
            // Draw things
        }
    }
}

这是由同一解决方案中另一个项目中包含的 Web 应用程序驱动的。我现在需要创建一个表单应用程序,该应用程序将使用完全相同的输入到 Web 表单上绘制完全相同的图形。我希望将项目包含在第二个解决方案中。但是课程需要看起来像这样:-

using System.Windows.Forms.DataVisualization.Charting;

namespace MyNameSpace
{
    public static class Utilities
    {
        public static void DrawOnGraph (Chart ourChart,
                                        // ...more parameters...
                                        )
        {
            ChartArea our_area = new ChartArea("Main");
            // Draw things
        }
    }
}

我想知道是否可以对两者使用相同的项目/类/代码,因为我自然不想将代码剪切'n'粘贴到两个不同的地方,唯一的区别是using指令。

我看不到如何使用泛型,因为(替代)命名空间中的对象函数内部有声明,例如上面显示的 ChartArea。我看不到使用条件编译的方法,因为需要哪一行取决于项目所在的解决方案,而不是项目本身,并且它不能引用调用者项目,因为这会创建循环引用。我也不能将 web 图表转换为 windows 图表。

我能做到的最好的办法是提供两个using指令,但根据我目前正在研究的解决方案将其中一个注释掉。但这对我来说似乎不是很满意。有没有更好的办法?还是我不应该这么闲着把代码写两遍?

4

4 回答 4

2

我能想到的最好的方法是为类创建包装接口,既System.Web.UI.DataVisualization.Charting提供System.Windows.Forms.DataVisualization.Charting/要求。然后提供接口的两种实现:一种用于Forms,一种用于UI。有了它,您Utilities可以在不知道确切实现的情况下调用接口方法,并为 UI 和表单共享代码。

于 2012-07-26T10:12:47.907 回答
2

您可以在绘图逻辑之上创建自己的抽象,并使用包装器模式来封装这两个图表。然后,您将针对您的抽象进行编码,并提供每个表单和 Web 项目的实现。我假设绘图逻辑足够复杂以证明这种方法的合理性。如果您实现这一点,它将允许您在一个地方引入图形更改,它将影响两个应用程序。

于 2012-07-26T10:12:03.447 回答
1

如果您的代码调用 Web.UI 和 Windows.Forms Charting 的相应 API 的“相同”部分,包括 Series、ChartArea 等操作,则可以使用条件编译。

只需将代码编译两次:一次使用Web.UI Charting,另一次使用Windows.Forms Charting。使用条件编译来启用/禁用程序集引用,以便一个程序集以基于 WinForms 的应用程序和其他 WebUI 图表应用程序为目标。

或者,在一些简单粗暴的情况下,您可以只使用 Windows.Forms Charting API,并且每当需要 html 时,例如img元素的src属性,只需使用Chart.SaveImage (..),等等上。但这有缺点。

这两种选择都有局限性,因为 Web.UI 和 Windows.Forms Charting 各自的 API 和功能没有足够的重叠。并且 SaveImage() 还受到限制,因为您不希望您的 Web 应用程序受到 Windows.Forms 程序集和无关操作的负担。

尽管如此,即使 Web 和表单程序集存在差异,条件编译方法也将起作用。您将能够维护共享代码(但有条件地为 Web 或表单编译),但每个库都会积累特定于其 Web 或表单目标的新代码。这种方法最适用于构建配置的好方法。如果您有一种构建配置的好方法,我认为它比其他方法更容易维护和扩展。

于 2013-07-02T21:48:04.787 回答
1

一种用于网络

using System.Web.UI.DataVisualization.Charting;

另一个用于窗户

using System.Windows.Forms.DataVisualization.Charting;

问题是他们将使用与他们的平台相关的类,所以我认为你能够实现它

我的建议是将常用功能分离到一个不依赖于 Web 或 Windows 的库中,并将其用于两种不同的解决方案,一个用于 Web,另一个用于 Windows,这样您就可以减少两次代码重复

更新 :

另一种选择是将其编写为 Windows 控件库,然后将其作为 DLL 在 Web 应用程序中使用。请看这个例子http://www.beansoftware.com/ASP.NET-Tutorials/Place-Windows-Control-To-Web-Form.aspx

于 2012-07-26T10:10:55.880 回答