【问题标题】:Please recommend a plan for migrating asp.net website to a three-layer architecture请推荐一个将asp.net网站迁移到三层架构的方案
【发布时间】:2011-10-05 00:31:17
【问题描述】:

我建立了一个 ASP.NET 网站,该网站的规模和复杂性都显着增长。一开始我没有创建 DAL 或 BLL,因为我是新手,并认为这对我来说更简单。相反,我使用了很多 SqlDataSources 并将所有业务逻辑放在相关页面的代码隐藏中。这是一个学习项目。但随着时间的推移,我一直在稳步添加功能,同时该网站的使用量显着增长。我现在发现自己有一些东西变得难以维护。一定要进行一些重构。

我想做的是开始分离我的 UI、业务逻辑和数据访问代码。我拿起了福勒的一本书,并且在网上也读了足够多的书,知道这是一件好事。我的麻烦是大多数示例和教程都假设读者是从头开始的。我需要制定一个计划来有条不紊地完成这项工作。我需要以一种允许我继续学习和培养技能的方式来做这件事。

因此,以所有这些为背景,我的问题是如何将这项任务分解成一口大小的块?例如,我应该先用一个新层替换所有这些 SQLDataSource 控件吗?或者,我应该从创建一些存储过程开始吗?或者也许我应该先迁移到 Linq。你现在可能明白了。我正在寻找的是一个答案,它规定了我可以用作路线图的一系列小的增量步骤。谢谢!

【问题讨论】:

    标签: c# asp.net design-patterns architecture refactoring


    【解决方案1】:

    我不会从 DAL 开始,这样您的代码可能不会变得更加清晰,但是您必须实现整个 DAL 基础架构并将其与您的 asp.net 代码绑定,这需要大量工作。理想的方法是从单元测试开始,但我想如果你的代码组织得不好,这并不容易。

    我会尝试先将业务逻辑提取到单独的层,这需要您像从头开始构建一样思考。我敢打赌,它会让你想在这个过程中进行更多的重构。您可以从创建一个单独的类库项目开始,然后使用所需的所有数据访问代码开始提取逻辑。

    当您的 UI 层除了表示逻辑之外没有其他任何东西时,就该重构您的新 BLL。为您的 DAL(例如工作单元)选择正确的抽象,以便您可以轻松编写单元和集成测试。

    然后写很多测试。然后你就可以真正开始重构你的代码了:)

    关键是不要试图从一开始就立即执行过多的重构,只需移动代码以使所有内容更加清晰和分离。在这种情况下,总会涉及到一些思想转变。

    【讨论】:

      【解决方案2】:

      首先创建一个 DAL 层,其中包含所有查询,然后将所有数据访问代码移至该层。稍后您可以根据复杂性决定是否使用存储过程等。将其与您当前的 UI(也有业务代码)集成以检查一切是否正常。确保您有适当的代码来处理连接和对象。

      然后将所有业务逻辑代码移至您的 BAL。

      【讨论】:

        【解决方案3】:

        从架构的角度来看,您可以分解代码以使用 MVC 模式:

        1. 把你的 SQL 东西放在你的数据访问层,你可以使用 EF 示例。
        2. 把你的逻辑东西放在控制器层。
        3. 将所有 UI 控件/视图放在视图层中。

        它们的通信方式是,您的控制器将处理从数据访问层检索到的数据(例如:进行一些计算等),然后控制器会将这些值传递给(绑定的)视图,或者简单地说: 数据访问层 控制器 视图

        以下是一些关于如何根据上述计划重构代码的提示:

        • 首先,从现有代码创建一些单元测试,甚至 尽管您可能无法模拟所有内容 您的描述,似乎代码是紧密耦合的。制作 确保单元测试通过您需要的所有案例。
        • 其次,将您的 SQL 查询内容从您的逻辑中分离到您的数据中 接入层。如有必要,更新您的单元测试并再次运行它们 以确保您的更改不会导致任何错误。
        • 第三,将逻辑与视图(UI 内容)分开。我们会打电话 这是您的控制器层。更新你的单元测试(如果你单元测试 用户界面)。
        • 最后但同样重要的是,您需要重构 控制器层遵循OO原则。你可以使用一些设计 模式以使您的代码更少耦合且更具可扩展性,因此,如果 你必须在将来添加一些东西,它们不会影响你的 现有代码。然后更新您的单元测试并确保它们通过。

        在重构之前进行单元测试非常重要,以确保您的更改不会破坏代码和/或产生新的错误。

        谢谢。

        【讨论】:

        • 我没有在问题中提到我的应用程序是一个网络表单。这会妨碍我遵循 MVC 模式吗?
        • 不,该方法仍然适用,而您的视图将是您的表单。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-21
        • 1970-01-01
        • 1970-01-01
        • 2012-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多