Angular.js 和 DAO 模式

Posted

技术标签:

【中文标题】Angular.js 和 DAO 模式【英文标题】:Angular.js and DAO pattern 【发布时间】:2013-04-19 13:19:50 【问题描述】:

首先我必须承认我对 Angular.js 很陌生,而且我之前没有使用过任何新一代的 js 框架,例如 Backbone 或 Knockout。我正在创建一个使用 RESTful API 与服务器通信的应用程序。我在 Angular 文档和博客笔记中做了很多工作,以便我能做对。

我发现的例子大多是$resource。看起来很不错:许多内置方法,当您正确设计 REST 接口时,您甚至不必再编写任何东西。

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

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

    从头开始编写所有内容,一直到 $http 抽象级别。我会将每个 DAO 方法实现为 $http 调用,注意错误。 通常使用 $resource 对象,如轻量级模型类,并将它们传递给 DAO,DAO 是唯一负责在它们上调用 .$save() 等操作的单元。当然我们不能阻止在不同的地方调用它,但是这种约定的解决方案对我来说已经足够了。

由于重用现有代码,第二种方式对我来说看起来更好。 $resource 具有良好的 promise 对象行为,如果我不必自己实现它,我会很高兴。

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

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

我在项目初期,我知道这个决定很可能会影响到以后的整个项目生命,所以我想选择最好的。

【问题讨论】:

使用 Angular 服务公开你的资源 【参考方案1】:

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

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

【讨论】:

并不是说你真的在这里有所收获。您刚刚公开了重命名为“存储库”的资源,并添加了“更新”方法。您仍然没有丰富的域模型对象,也没有比调用 customer.$save() / customer.$update() 带来的任何好处 @zappan 也许我错过了什么,得到的是你不必重复 '$resource("rest/customers/:id", id:'@id' , 'update': method:'PUT');'在任何你想用该资源做某事的地方。如果您愿意,可以将名称从 CustomerRepository 更改为 CustomerResource,重点是将 $resource 的创建保留在一个地方。 您错过了这不是 DAO 模式,这意味着模型(富域模型,如果您愿意)和负责处理的 DAO(数据访问对象)之间的关注点分离模型的持久存储。最初的问题是关于 DAO 模式,这不是 $resource 的全部内容。 我的意思是,通过将 $resource 包装在 Angular 服务中并将其视为存储库,您可以获得 DAO 模式带来的一些优势。想想对资源执行 GET、POST、PUT 和 DELETE 的服务器的静止调用。类似于您将在服务器端执行的 CRUD 操作。然后,您可以将 js 对象视为您的富域模型,而不是从 js 对象进行休息调用(例如 myDAO.get 而不是 myObj.get())。

以上是关于Angular.js 和 DAO 模式的主要内容,如果未能解决你的问题,请参考以下文章

长数组列表渲染使 Angular.js 中的页面滚动变慢

Angular JS JQuery 模式未显示

Angular.js 的初步认识

java中的dao模式

DAO模式(单表)

工厂设计模式和DAO设计模式有啥区别