Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript js和DAO模式_Javascript_Activerecord_Angularjs_Dao - Fatal编程技术网

Javascript js和DAO模式

Javascript js和DAO模式,javascript,activerecord,angularjs,dao,Javascript,Activerecord,Angularjs,Dao,首先,我必须承认我对Angular.js非常陌生,而且我以前从未使用过任何新一代js框架,比如主干框架或淘汰框架。我正在创建一个使用RESTfulAPI与服务器通信的应用程序。我在angular文档和博客笔记中挖掘了很多东西,以便我能正确地完成它 我找到的例子大部分都是关于。它看起来相当不错:许多内置方法,当您正确设计REST接口时,您甚至不需要再编写任何东西 但我(以及我的整个团队)更习惯于JavaEE对模型层的思考方式:轻量级模型类(POJO等)、持久化和获取模型的DAO类,以及DAO和控制

首先,我必须承认我对Angular.js非常陌生,而且我以前从未使用过任何新一代js框架,比如主干框架或淘汰框架。我正在创建一个使用RESTfulAPI与服务器通信的应用程序。我在angular文档和博客笔记中挖掘了很多东西,以便我能正确地完成它

我找到的例子大部分都是关于。它看起来相当不错:许多内置方法,当您正确设计REST接口时,您甚至不需要再编写任何东西

但我(以及我的整个团队)更习惯于JavaEE对模型层的思考方式:轻量级模型类(POJO等)、持久化和获取模型的DAO类,以及DAO和控制器之间的可选服务层。另一方面,在Angular$resource中创建了更类似于活动记录的内容

我已经提出了两种在Angular中实现DAO模式的方法:

  • 从头开始编写,一直到$http抽象级别。我会将每个DAO方法实现为$http调用,注意错误
  • 使用$resource对象(通常类似于轻量级模型类)并将其传递给DAO,DAO是负责对其调用$save()等操作的唯一单元。当然,我们不能阻止在不同的地方调用它,但这样的约定解决方案对我来说已经足够好了
  • 第二种方法更适合我,因为它重用了现有的代码$资源具有承诺对象的良好行为,如果我不必自己实现它,我会很高兴

    最后一个主要问题是:活动记录方法是在Angular、Backbone和其他类似工具中正确访问数据的唯一方法吗?也许有人已经尝试在他的代码中加入类似于DAO的解决方案,并可以分享他的想法

    第二个问题是:$resource对象在处理错误、连接丢失和各种问题时是否足够?考虑到这一点,是否值得使用$resource,或者最好从较低级别的$http开始


    我正处于项目的开始阶段,我知道这个决定很可能会影响到以后整个项目的生命周期,所以我想选择最好的。

    我完全同意。我是这样做的:

    bankApp.factory("CustomerRepository", function ($resource) {
        var customerRepository = $resource("rest/customers/:id", {id:'@id'}, {'update': {method:'PUT'}});
        // You can also add addition repository like $http calls onto the
        // customerRepository like getting the count and other stuff.
        return customerRepository;
    });
    
    然后,您可以在任何需要的地方注入CustomerRepository。例如:

    bankApp.controller("BankController", function ($scope, CustomerRepository) {
    
        $scope.customers = CustomerRepository.query();
    
        $scope.createCustomer = function () {
            CustomerRepository.save($scope.customer, function (customer) {
                ...
            });
        };
    
        ...
    
        $scope.saveCustomer = function () {
            CustomerRepository.update($scope.customer, function (customer) {
                ...
            });
        };
    });
    

    使用angular Service公开您的资源并不是说您在这里实际获得了一些东西。您刚刚公开了重命名为“repository”的资源,并添加了“update”方法。您仍然没有丰富的域模型对象,也没有比调用customer.$save()/customer.$update()@zappan更大的好处。也许我遗漏了什么,得到的是您不必重复“$resource”(“rest/customers/:id”,{id:'@id'},{update':{method:'PUT'}”);”无论在哪里,你都想用这些资源做点什么。如果愿意,请将名称从CustomerRepository更改为CustomerResource,重点是将$resource的创建保持在一个位置。您缺少的是,这不是DAO模式,这意味着模型(如果愿意,可以使用富域模型)和DAO(数据访问对象)之间的关注点分离它负责模型的持久存储。最初的问题是关于DAO模式的,这不是$resource的全部内容。我想说的是,通过将$resource包装在一个角度服务中,并将其视为一个存储库,您可以获得DAO模式带来的一些优势。想象一下对服务器的restful调用,您在那里对资源执行GET、POST、PUT和DELETE操作。类似于在服务器端执行的CRUD操作。然后,您可以将js对象视为富域模型,而不是从js对象执行rest调用(例如myDAO.get而不是myObj.get())。