如何创建一个可能使用两个命名空间之一的类?

时间:2012-07-26 09:59:26

标签: c# graph using

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

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
        }
    }
}

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

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

我能够管理的最好的是提供两个using指令,但根据我目前正在处理的解决方案,将其中一个指出。但这对我来说似乎并不令人满意。有没有更好的办法?或者我不应该如此闲置并且两次编写代码?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

我能想到的最好的灵魂是为类创建包装接口,System.Web.UI.DataVisualization.ChartingSystem.Windows.Forms.DataVisualization.Charting都提供/要求。然后提供两个接口实现:一个用于Forms,一个用于UI。有了这个,你的Utilities可以在不知道具体实现的情况下调用接口方法,并共享UI和Forms的代码。

答案 2 :(得分:1)

一个用于Web

using System.Web.UI.DataVisualization.Charting;

和另一个用于Windows

using System.Windows.Forms.DataVisualization.Charting;

问题是他们将使用与他们的平台相关的课程,所以我认为你无法实现它

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

更新:

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

答案 3 :(得分:1)

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

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

或者,在一些快速和肮脏的情况下,您只需使用Windows.Forms Charting API,并且只要需要html,例如 img 元素的 src 属性,仅使用 Chart.SaveImage (..),依此类推。但这有弊。

这两种替代方案都有限制,因为Web.UI和Windows.Forms Charting各自的API和功能不够重叠。而SaveImage()是另外限制的,因为您不希望您的Web应用程序受到Windows.Forms程序集和无关操作的负担。

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