65.9K
CodeProject 正在变化。 阅读更多。
Home

不同方法 - 使用 ASP.NET MVC 和 AngularJS(附带 TypeScript)构建迷你 SPA

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2016年12月12日

CPOL

4分钟阅读

viewsIcon

15794

使用 ASP.NET MVC 和 AngularJS(附带 TypeScript)构建迷你 SPA

引言

在本文中,我们将讨论一种模块化的方式来开发 AngularJS 单页应用程序,以提高可维护性。

示例代码演示了注册和登录功能,您可以根据需要进行改进。它可以在 Github 上找到,链接为 此链接

背景

为了理解代码,您应该了解以下技术:

  • AngularJs 1.5 – 用于应用程序的业务逻辑
  • ASP.NET MVC 5 – 用作 AngularJS 代码的包装器
  • TypeScript 2.0 – 用于在 AngularJS 代码中轻松实现 OOP
  • ASP.NET Web Api 2 & Oauth – 用于应用程序的服务器端业务逻辑
  • Mongodb – 用于存储数据(可选)
  • 存储库模式 – 用于将数据访问层与应用程序解耦(可选)
  • MEF(可选)

本文要点

  • 将 AngularJs 开发为迷你 SPA
  • 使用 AntiforgeryToken基于令牌的身份验证和授权 来保护 Web API 2
  • 在 AngularJS 中使用 TypeScript 来实现 OOP
  • 使用 ASP.NET MVC 来 降低大型应用程序的复杂性
  • 模块化 风格开发 SPA

传统 SPA 方法的缺点

  • 大型应用程序难以维护,因为所有内容都直接添加到单个页面/文件中
  • 单个路由文件变得越来越大,难以维护
  • 单个主页存储所有应用程序的引用,如 CSS 和 JS 文件。
  • 理解和维护现有应用程序变得非常困难,更改可能导致更多错误
  • 无法使用 ASP.NET MVC AREA 这样的方法来分离功能和代码
  • 混合 AngularJS 代码和 ASP.NET MVC 代码,这不是一个好主意(这种方法非常不灵活,有时为 AngularJS 代码编写单元测试用例会非常棘手。)
  • 无法利用 OOP

我的方法的优点

  • 与其开发一个大型 SPA,不如将功能分解成多个迷你 SPA
  • 使用 TypeScript 在 AngularJS 代码中实现 OOP
  • 为每个迷你 SPA 设置单独的路由文件
  • 为每个迷你 SPA 设置单独的 ng-app 模块,并且该模块可以在其他模块中重用
  • 为每个迷你 SPA 设置单独的主页,该主页可以只包含所需的引用文件
  • 一个模块可以在一个迷你 SPA 中用作应用程序模块/根模块,也可以在另一个迷你 SPA 中用作普通模块
  • 使用 ASP.NET MVC 作为包装器,仅用于加载所需的引用、打包引用文件以及为迷你 SPA 的主页。
  • 可以在 UI 项目中执行基本身份验证,因为 ASP.NET MVC 是包装器,并且每个功能(迷你 SPA)都可以受到保护。

假设我们正在开发一个约会网站,具有以下功能:

  • 欢迎页面
  • 注册
  • 登录
  • 外部登录
  • 个人资料搜索
  • 高级搜索
  • 个人资料
  • 通过卡/PayPal 付款

与其将这些功能视为一个应用程序,不如将上述功能分解成三个迷你 SPA,如下所示:

  1. HomeSpa
    • 欢迎页面
    • 注册
    • 登录
    • 外部登录
  2. SearchProfileSpa
    • 个人资料搜索
    • 高级搜索
    • 个人资料
  3. PaymentSpa
    • 通过卡付款
    • 通过 PayPal 付款

** 示例代码中仅实现了前两个功能,可在 GitHub 上找到,在此处

示例代码说明

示例代码解决方案具有以下层:

  1. UI 文件夹 - Sample.MVC.Angular.UI – 这是一个 AngularJS 项目,但包装在 ASP.NET MVC 中。
  2. ApplicationServices 文件夹 - DatingSite.WebApi4 – 这是一个 Web API 层,在 AngularJS 代码中被调用。
  3. DomainServices 文件夹 – 包含与业务层相关的项目,这些项目被 WebApi4 项目调用。
  4. MongoDbAccess – 包含与数据访问层相关的项目,这些项目被 Sample.DomainServices 项目调用。

您可以只关注 UI 文件夹 - Sample.MVC.Angular.UI 项目。底层遵循存储库模式,您可以轻松地将这些层替换为您自己的业务和数据访问层。

下图(图 1)显示了 UI 项目中的迷你 SPA 文件夹结构

对于每个迷你 SPA,我们都有一个 MVC 控制器和一个视图页面,它们将扮演容器页的角色,类似于 ASP.NET MVC AREA,并将包含相关迷你 SPA 的所有引用文件。

所有 AngularJS 代码都放在 MiniSpas 文件夹下,并为每个迷你 SPA 创建一个子文件夹。

所有迷你 SPA 都是 AngularJS 模块,可以像其他模块一样被重用。

ModuleInitiator.js

当调用 MiniSpas.ModuleInitiator.GetModule() 方法时,此模块会自动创建或加载具有所需依赖项的模块。

_Layout.cshtml

该文件包含所有迷你 SPA 使用的文件引用。

并且特定于某个迷你 SPA 的引用将位于 index.cshtml 页面中,当请求迷你 SPA 时,该页面会被 MVC 控制器调用,如下所示:

迷你 SPA 结构

每个迷你 SPA 都有自己的路由和模块创建代码。代码分为两层 – 控制器和服务,如下所示:

就是这样

您需要仔细阅读代码以获得更好的理解。请告诉我您对该方法/应用程序架构的看法。

© . All rights reserved.