【问题标题】:Handling multiple modules in angular dart在角度飞镖中处理多个模块
【发布时间】:2014-09-11 11:39:37
【问题描述】:

我正在为一家拥有 3 家不同公司的公司创建一个网站。因此,该域将有 3 个子域,如下所示:

  • www.example.com
  • firm1.example.com www.example.com/firm1
  • firm2.example.com www.example.com/firm2
  • firm3.example.com www.example.com/firm3

公司之间不会共享代码。每个公司都有自己的数据库托管在同一台服务器上。每个公司都有一个指向主页的链接,即 www.example.com。

我决定为每个公司创建一个模块和一个将从 main.dart 调用的主模块。现在我如何以及何时调用第二个模块。这样做时,我不理解在控制器上使用模块的必要性。

  • 在这种情况下模块化应用程序是否正确?
  • 拥有多个模块有什么优势?
  • 我们应该为每个模块使用一个路由器吗?我问这个的原因是,如果将来我打算删除firm3并将它放在一个不再坚持主应用程序的单独域中,那么我将不得不从路由器中删除相应的路由,这不太可能模块化应用。

【问题讨论】:

    标签: dart angular-dart


    【解决方案1】:

    模块与控制器不同。一个模块包含应用程序的所有部分。这包括控制器、服务、指令等。控制器只是属于模块的一个东西。模块不仅包含应用程序的某些部分,而且还允许每个部分找到彼此。模块是依赖注入的基础。

    因此,您在一家公司中有 3 家不同的公司。这些公司是否属于同一个域?它们是单独的网站还是单个网站?如果每个公司都有自己的域或单独的网站,您将别无选择,只能将它们分成单独的 Angular 应用程序。单页应用程序不能跨越多个域。

    如果您为每个模块定义路由器,那么您正在寻找单独的应用程序。您可以定义 3 个单独的模块并将它们导入主应用程序,但主应用程序将定义路由器。我不完全确定每个应用程序可以在单独的模块中拥有多个路由器。我找不到任何这样的例子。理论上也许可以,但似乎很难维护。

    但仅考虑到我们所知道的情况,很难再提出任何建议,因为这 3 家公司的互动方式并不清楚。他们会共享代码吗?它们是否必须全部在一个页面应用程序中,或者您可以将它们拆分为单独的 html 页面,每个页面都有自己的 Angular 应用程序?

    更新:

    所以我会用自己的路由器将每个公司分成自己的应用程序。我会让它们成为一个单独的单页应用程序。您可以选择是否共享代码。我的应用程序由多个单页应用程序组成,我在它们之间共享代码。这是我的做法:

    var RegistrationApp = angular.module("RegistrationApp", ["ngResource",'ui.bootstrap',"ngRoute", "ngAnimate"]);
    var App = RegistrationApp;
    

    然后在我定义的任何其他类型的事物中,我都会像这样使用全局变量 App:

    App.factory("RegistrationService", function($http) {
    

    通过在我构建的所有应用程序中定义全局变量 App,我可以简单地通过将这些组件包含在客户端正在加载的应用程序中来共享代码,它将将该代码拉入该应用程序的模块中。

    登录将是服务器端所做的事情,它会在您的浏览器上放置一个 cookie,因此从技术上讲,每个应用程序都可以使用该身份验证,只要 cookie 映射到域。如果您对每个公司都有单独的 URL(即,firm1.company.com、firm2.company.com、firm3.company.com),则必须小心该 cookie 的定义方式,因为默认情况下,如果您在 www.company 下登录。 com cookie 不会被firm1、firm2、firm3 看到,因为它们是不同的域。您必须为 .company.com 设置一个 cookie,以便子域可以看到它。但是,如果您正确登录,则不需要公司/应用程序之间的通信。

    【讨论】:

    • 嗨@chubbsondubs,我已经为这个问题添加了更多信息。从您的回复中,我可以看到我必须创建 1 个应用程序、4 个模块(1 个主模块)和 1 个路由器。我应该在开始时加载所有模块,即 main.dart 吗?所有模块都应该调用RouteInitializer吗?
    • 他们唯一可以交流的时间是登录。 www.example.com/firm1 或firm2 或firm3 将在用户重新路由到www.example.com/login 时要求用户登录。这种情况与谷歌网站完全相同。登录后,它会在任何地方反映出来,例如 images.google.com、www.gmail.com 等
    【解决方案2】:

    一个模块用于组合注入器的一组类型注册。通常,即使您只有一家公司,您也会有多个模块。

    看看这个例子:https://github.com/akserg/angular.dart.ui/blob/master/lib/carousel/carousel.dart 这是一个 Carousel 组件,它由两个组件组成,这两个组件总是一起使用,并且依赖于 TransitionModule。
    CarouselModule 允许您使用 install(new CarouselModule); 注册所有这些类型

    模块与程序逻辑无关,它更多的是用于一次注册一组Angular组件、指令、服务……。

    控制器就是程序逻辑。

    这三个公司有什么区别? 您可以创建三个不同的应用程序,然后将要在这些应用程序之间重用的代码移动到一个包中,然后从这三个应用程序中导入此包。

    更新

    如果这 3 个应用程序不共享代码,那么将它们放在一个应用程序中没有任何意义。 您可以使用您正在使用的 Web 服务器的虚拟目录功能。

    你得到的是应用程序之间的依赖关系,这些应用程序没有任何共同点(除了从同一服务器提供服务)。

    您必须应对代码大小。每个用户都加载了 3 个应用程序的代码,即使他想要并且只能使用其中的 1/3。 在 Dart 中,按需加载代码并不容易(至少现在还没有)。

    总结:您的方法没有优点和严重的缺点。改为创建三个独立的应用程序。

    【讨论】:

      【解决方案3】:

      我认为最简单的方法是在网络服务器级别进行管理。

      如果我理解得很好,你有 4 个独立的站点:

      • www.example.com
      • firm1.example.com
      • firm2.example.com
      • firm3.example.com

      我使用的是 Apache,这意味着不同的 4 个虚拟主机。然后,您只需使用例如 .htaccesswww.example.com/firmN 重定向到 firmN.example.com

      Alseo,安全方面,这种方法允许将每家公司的数据放在一个单独的容器中,如果一旦你在一个站点上受到攻击,你不希望攻击者拥有访问所有其他网站。

      【讨论】:

        猜你喜欢
        • 2017-11-26
        • 1970-01-01
        • 2020-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多