Angular.js和DAO模式

时间:2013-04-25 15:02:24

标签: javascript activerecord angularjs dao

首先,我必须承认我对Angular.js很新,我之前没有使用像Backbone或Knockout这样的新一代js框架。我正在创建一个使用RESTful API与服务器通信的应用程序。我在角度文档和博客笔记中挖了很多,所以我能做得对。

我发现的例子主要是$resource。它看起来非常好:许多内置方法,当你正确设计REST接口时,你甚至不需要再编写任何东西了。

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

我完全同意。这是我的方式:

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) {
            ...
        });
    };
});