我有一个项目,其中包含一个绘制图形的类。该课程如下: -
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
指令,但根据我目前正在处理的解决方案,将其中一个指出。但这对我来说似乎并不令人满意。有没有更好的办法?或者我不应该如此闲置并且两次编写代码?
答案 0 :(得分:2)
您可以在绘图逻辑之上创建自己的抽象,并使用包装模式封装两个图表。然后,您将针对您的抽象进行编码,并为每个表单和Web项目提供实现。我认为绘图逻辑的复杂程度足以证明这种方法的合理性。如果实现这一点,它将允许您在一个地方引入图形更改,它将影响两个应用程序。
答案 1 :(得分:2)
我能想到的最好的灵魂是为类创建包装接口,System.Web.UI.DataVisualization.Charting
和System.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或表单目标的新代码。这种方法最适合构建配置的好方法。如果你有一个很好的构建配置方法,我认为它比其他方法更容易维护和扩展。