在ASP.NET MVC中DRY原理实际上是什么样的?

时间:2008-10-09 15:36:59

标签: asp.net asp.net-mvc dry

我一直听说DRY原则以及它在ASP.NET MVC中如此重要,但是当我在Google上进行研究时,我似乎并不完全清楚它是如何应用于MVC的。

从我所看到的并不是真正的副本&粘贴代码气味,我认为它是,但它不止于此。

您是否可以对我在ASP.NET MVC应用程序中如何使用DRY原理有所了解?

8 个答案:

答案 0 :(得分:7)

DRY只是意味着“不要重复自己”。确保在编写代码时只编写一次代码。如果您发现自己在所有Controller类中编写了类似的功能,请创建一个具有该功能然后从中继承的基本控制器类,或者将该功能移动到另一个类并从那里调用它,而不是在所有控制器中重复它。

答案 1 :(得分:4)

  • 使用过滤器属性来管理方面(身份验证,导航,面包屑等)
  • 使用layer supertype控制器(对其应用通用控制器级过滤器,请参阅mvccontrib for an example
  • 编写自定义操作结果(例如in mvccontrib - 例如,我们创建了一个名为logoutresult,只执行FormsAuthentication.Logout()
  • 使用视图名称约定
  • 最重要的是 - 让控制器操作 dumb ,寻找服务中的重用机会

答案 2 :(得分:2)

不要重复自己。它可以应用于编程的许多不同方面。最基本的是防止代码味道。我没有使用过ASP.NET,因此我无法对它和MVC进行具体说明。

  • 在C ++中,模板预先安装了相同功能的多个副本。
  • 在C void *指针可以以类似的方式使用,但要非常小心。
  • 继承自另一个函数允许函数允许其他函数使用相同的代码库而无需复制代码。
  • 规范化数据库中的数据可最大限度地减少冗余数据。同时遵守DRY原则。

当你回顾一个项目中的“思想”时。问问自己。

  1. 我已经写过这段代码吗?
  2. 此代码在其他地方是否有用。
  3. 我可以通过建立以前的类/功能来保存编码。

答案 3 :(得分:1)

DRY并非特定于任何 one 技术。只需确保从功能角度(甚至从复制/粘贴编码器视图)查看您的类,并查看重复发生的位置。这个过程可能不会一次性完成,只有在几个月后添加新功能时查看代码后才会发现重复。如果你有单元测试,你应该不必担心删除重复。

答案 4 :(得分:1)

与不重复自己相关的MVC的一个优点是,您的控制器可以执行一个类中所有页面共有的任务。例如,可以集中验证针对某些类型的恶意请求或验证身份验证。

答案 5 :(得分:0)

DRY不仅应该应用于代码,还应该应用于一般信息。你在构建系统中重复一些事情吗?您是否有应该移动到公共配置文件等的数据

答案 6 :(得分:0)

嗯,我可以提供的关于DRY和UI的最常见示例是使用MasterPages和UserControls之类的东西。

MasterPages确保您只编写了一次所有静态HTML。

UserControls确保代码的可重用性。例如,您将有很多表单执行CRUD等基本操作。现在,理想情况下,我们希望所有用户都可以看到创建和更新的不同页面,尽管两者中的表单字段几乎相同。我们可以做的是组合所有常用控件并将它们放入一个可以在两个页面上重用的控件。这可以确保我们永远不会重新输入(或复制粘贴)相同的代码。

DRY在MVC中尤其重要,因为完成相同任务的文件数量增加了。

答案 7 :(得分:0)

似乎存在一种误解,认为域模型中的所有内容都必须作为特殊视图模型进行复制。您可以将域模型设置为域模型,但是视图模型可以是对域特定信息一无所知并且更通用的模型。例如:

域模型类:帐户,资产,PurchaseOrder

View Model:List,Table,Tuple,SearchFormBackingModel:Checked options,Outputoptions等。视图本身可能更具视图实现特性。

Tuple / Dictonary / Map可能映射到Account,Asset和PurchaseOrder单个实例,但是Table可能对它们的集合等有用。你仍然有MVC但是你有会话数据,还没有准备好在视图中进行交易模型没有必要违反你的领域模型的规则,这是规则应该去的地方。他们将以这种方式减少贫血和反模式。您可以预先传递这些规则并在那里或后面或两者中使用它们,具体取决于系统从客户端读取的方式等。