如何分层ASP.NET/C#web应用程序的最佳实践

如何分层ASP.NET/C#web应用程序的最佳实践,c#,asp.net,C#,Asp.net,我已经在一个ASP.NET/C#web应用程序上工作了一段时间,它的大小已经大大超过了它的编程方式。它变得很难维护,而且很快变得越来越难,过去需要1小时才能更新的东西现在需要3-4小时 我相信重新设计应用程序以使用不同的层将有助于解决这些问题。然而,我读得越多,似乎每个人的做法都不同,但实现的目标基本相同 我已经看到了表示/用户界面、数据库、业务、服务等层。看起来3层可能是最好的,但我不确定 我应该在web应用程序中设置哪些层,每个层应该包括或限制哪些层? 从以前的经验中所说的话是最值得赞赏的

我已经在一个ASP.NET/C#web应用程序上工作了一段时间,它的大小已经大大超过了它的编程方式。它变得很难维护,而且很快变得越来越难,过去需要1小时才能更新的东西现在需要3-4小时

我相信重新设计应用程序以使用不同的层将有助于解决这些问题。然而,我读得越多,似乎每个人的做法都不同,但实现的目标基本相同

我已经看到了表示/用户界面、数据库、业务、服务等层。看起来3层可能是最好的,但我不确定

我应该在web应用程序中设置哪些层,每个层应该包括或限制哪些层?


从以前的经验中所说的话是最值得赞赏的

我认为常用的方法有三层:表示层、业务逻辑层和数据访问层。应提供良好的基础。


话虽如此,我需要指出的是,对ASP.NET WebForms项目进行分层可能没有多大帮助。该框架最大的问题是其背后的代码,它诱使开发人员创建怪物页面,同时与所有层和服务对话,以获取要显示的数据。解决方法是首先解决这个表示层,让代码只与一个特定层(通常是业务逻辑)交互。当(如果)这样做了,那么项目可能会成功重构。

分离关注点可能是查看web应用程序和分解内容的更好方法。比如说,如果您有一个页面正在进行数据访问、验证和显示项,那么您可以获取这些项中的每一项,并创建它自己的类,以便在每个类中只发生一种类型的事情。然后,当您完成并开始重构代码时,您可以开始将相同类型的类分组到相同类型的文件夹、名称空间和项目中


祝你好运,你前面还有很多工作要做。

你说每个人的做法都有点不同,这是正确的。我们就是这样做的:

领域 模型类对象,如客户、帐户等
查找-值对象,如AccountType、IndentityType等。
存储库或DataAccessObjects当前我们在较旧的应用程序上使用LinqToSql和SQLClient。

服务 每个模型或集合的服务。您也可以将其称为应用程序层。我们的想法是,我们可以改变到一个不同的用户界面,它将涉及尽可能少的代码更改

用户界面 目前,我们在较新的应用程序中使用Asp.net和MVC

我们的想法是,我们可以在图层中插入不同的“东西”,而不影响其他图层。例如,如果我开始使用EntityToSql,UI或服务层就不再明智了。它只知道它创建了一个IRepository并调用FindAll()方法。我们还将旧的应用程序转换为MVC,在转换之前,我们将它们划分为这些层,以便在出现其他问题时,我们希望实现我们的服务层和域层,而不必进行更改


重要的是要经常问自己,这个应该住在哪里?UI中的逻辑实际上应该局限于UI逻辑。重要的是让团队中的每个人都了解您的方式并愿意实施它…

主要是管理依赖关系


很好的例子是和。您可以下载一些开源示例应用程序以获得更多信息。

查看ASP.NET的模型。您描述的问题对于ASP.NET应用程序来说是非常常见的,重构它以匹配MVC模型可能是一种方法。别误会我的意思-这肯定需要一些工作-但我想,这是值得的。

我相信这在很大程度上取决于需求和需要什么。构建应用程序的方法有多种类型的设计模式。我发现,从需求中充分消化我试图实现的目标,并在这个网站上找到与模式相匹配的方法是很有帮助的。给予或接受独特的环境


这个网站实际上是按设计模式对其进行细分。允许您根据您的需求和可扩展性需求进行良好匹配。

传统分层只是解决方案的一部分。因为这是你的问题,所以我知道很多非常大的站点都是按表示、业务逻辑和数据访问分层的

但是,您可以/应该做的还有很多,包括:

  • 分层和分工:以可维护的方式在web层和数据层之间划分业务逻辑(通常意味着使用存储过程而不是动态SQL)
  • 重构应用程序。在许多站点中,由于对持续重构的关注不够,页面变得庞大且难以管理。使用诸如自定义用户控件、母版页、公共页面基类、ASP.NET外观、页面适配器、控件适配器、HttpModules等方法,将应用程序范围的逻辑移动到可集中管理的位置
  • 仔细遵守OO设计原则
  • 战略性地利用事件来帮助确保持续的关注点分离

  • “诱使开发人员创建同时与所有层和服务对话的怪物页面”这是我试图解决的问题之一。总体来说不错,但我认为您也可以从分离的数据访问层中受益。是的,如果一切都由我决定,我可能会这么做。。。但这是团队的决定O)