【问题标题】:How to stay DRY when logic needs a C# and Javascript implementation?当逻辑需要 C# 和 Javascript 实现时如何保持 DRY?
【发布时间】:2009-02-25 16:48:34
【问题描述】:

我目前正在使用 ASP.NT MVC RC1 来实现一个基本的时间表应用程序。我想遵循 DRY 原则,但在一种特殊情况下很难做到:

我的一个视图,实际上是一个局部视图,有许多文本框,表示在特定任务上花费的小时数,一周中每天一个文本框。当我最初加载页面时,我希望视图中有一个文本框来显示所有这些小时的总数。此外,我希望在更改文本框中的值时更新该总数。对文本框的更新不会导致完整的回发,只会导致对结果不做任何事情的 AJAX 回发(回发会更新 DB 上的值,但返回的 ActionResult 是 EmptyResult,因为我不需要在用户界面)。

目前我让控制器创建一个视图,该视图填充了该视图的“总计”,因此添加所有值的逻辑在 C# 控制器中。在 UI 方面,我有更新 UI 级别总数的 javascript。但这不好,因为如果我改变计算总数的逻辑,我必须在两个地方改变它!啊!不干燥!

那么,我该怎么做呢?到目前为止,我唯一的答案是废弃计算 UI 上的总数的 javascript 代码,而是让 AJAX 回发返回该视图的新“总数”。

还有其他方法吗?

【问题讨论】:

    标签: c# javascript dry


    【解决方案1】:

    你可以试试Nikhil Kothari's Script# project。它是一个交叉编译器,可将 C# 编译并转换为独立于浏览器的 javascript,让您共享逻辑。它被 Microsoft 内部的许多团体用于此目的。

    更多,来自网站:

    Script# 为 Ajax 和 JavaScript 开发带来生产力。 Script# 是一个免费工具,可让开发人员创作 C# 源代码 代码并随后将其编译成可以跨平台运行的常规脚本 所有现代浏览器,并在此过程中利用生产力和 现有 .NET 工具以及 Visual Studio IDE 的强大功能。脚本# 为您提供一种开发方法和方法,为您带来 软件工程、长期可维护性和可扩展性 Ajax 应用程序、组件和 框架。

    Script# 被 Microsoft 大楼内的开发人员广泛使用 Windows Live、Office 中的 Ajax 体验仅举几例,如 以及包括 Facebook 在内的外部开发人员和公司。如果 您正在构建基于 Ajax 的 RIA 应用程序,您应该为自己 今天试试 Script# 看看它是否能帮助你改进自己的 Ajax 发展!

    【讨论】:

      【解决方案2】:

      在最严格的意义上,在 C# 和 Javascript 中计算总时间的逻辑并不是 DRY,这是真的。有人可能会因为它们是在两个不同环境中运行的两种不同语言这一事实​​而争论不休,但归根结底,如果您更改其中一种,则必须同时更改两者。

      我认为这是形式和功能之间的权衡。拥有 javascript 有多重要?如果 AJAX 调用太慢(确实有可能),那么现在可能是时候意识到 DRY 原则是指导原则,而不是法律。

      【讨论】:

      • 指导原则,而不是法律。如果您需要两个地方的逻辑,并且共享相同的实现在技术上是不可行的,那么您将不得不实现它两次。运气不好,这就是生活。 ;)
      • @jalf:完全正确。 (任何)准则都不是牢不可破的存在法则。
      【解决方案3】:

      如果您希望代码在服务器和客户端上都执行,您可以使用/编写表达式树到 JavaScript 编译器。

      在服务器端,您计算表达式并将翻译成 JavaScript 的相同表达式发送到客户端。

      【讨论】:

      • 您是否建议使用 C#->Javascript 翻译器来创建 javascript 客户端?或者您的意思是在服务器端和客户端都使用 javascript?
      • 不,我认为他的意思是有一个可以由 C# 和 Javascript 执行的“表达式”
      • 是和不是。表达式树是 C#/VB.NET 表达式子集的内存表示。它们可以很容易地在服务器上进行评估。但是,您必须编写一个将此类表达式树转换为 JavaScript 的组件。
      猜你喜欢
      • 2011-07-04
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      相关资源
      最近更新 更多