首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工厂模式与ngResource

工厂模式与ngResource
EN

Stack Overflow用户
提问于 2015-12-16 16:59:39
回答 1查看 431关注 0票数 1

我有一个工厂,它提供对资源对象的访问,如下所示。最初,我在一个控制器中实现了这个功能,但是我把它移到了一个工厂,使它在我的整个应用程序中更加可重用。

当我在构建它的时候,关于提供者的一条直线吸引了我的眼球:

最佳实践:将工厂功能命名为工厂(例如,apiTokenFactory)。虽然这个命名约定不是必需的,但它有助于在调试器中导航代码库或查看堆栈跟踪。(来源)

我显然不会在下面这样做(因为我遵循的是资源Doc的模式)。但后来我想弄清楚这是什么类型的提供者,我不确定,他们不包括任何其他类型的提供商详细的最佳实践说明。我应该使用service()而不是factory()吗?(我真的找不到明确的答案。)

这个问题显然风险很小,因为应用程序运行得很好(比我不使用工厂时更好)。但我对意见很好奇。

代码语言:javascript
复制
...

.factory("Entries",Entries)

...

function Entries($resource,config) {
    endpoint = config.endpoint + ":" + config.port + "/entry";
    return $resource(endpoint + '/:id', {id:'@id'},
        { 'get':    {method:'GET'},
          'create': {method:'POST'},
          'update': {method:'PUT'},
          'query':  {method:'GET', isArray:true},
          'remove': {method:'DELETE'},
          'delete': {method:'DELETE'}
        }
    );
}
EN

回答 1

Stack Overflow用户

发布于 2015-12-16 18:31:18

如果它是一家工厂,就把它当作一家工厂。我从不使用服务提供者,因为我发现它没有提供任何超过工厂方法的东西,而且我的大脑更容易理解工厂模式。

对于工厂,您提供了一个函数,返回您希望角的注入器使用的对象。对于服务,您可以提供一个构造函数。然后,注入器创建将通过使用提供的函数向对象注入的对象。角工厂的和服务的总是单一的,所以提供一个构造函数来增加一个单一的对象,对我来说似乎有点过分了。

在您的情况下,如果您将其转换为服务,则您的对象基本上只是充当代理,如下所示

代码语言:javascript
复制
...

.service("Entries",Entries)

...

function Entries($resource,config) {
    var endpoint = config.endpoint + ":" + config.port + "/entry";
    var resource = $resource(endpoint + '/:id', {id:'@id'},
        { 'get':    {method:'GET'},
          'create': {method:'POST'},
          'update': {method:'PUT'},
          'query':  {method:'GET', isArray:true},
          'remove': {method:'DELETE'},
          'delete': {method:'DELETE'}
        }
    );

    this.get = resource.get;
    this.create = resource.create;
    this.update = resource.update;
    this.query = resource.query;
    this.remove = resource.remove;
    this.delete = resource.delete;
}

这很难看,除非你真的想抽象化出你正在使用的$resource,否则这是没有意义的,同样,你也可以用一个工厂做同样容易的事情。

代码语言:javascript
复制
...

.factory("Entries",Entries)

...

function Entries($resource,config) {
    var endpoint = config.endpoint + ":" + config.port + "/entry";
    var resource = $resource(endpoint + '/:id', {id:'@id'},
        { 'get':    {method:'GET'},
          'create': {method:'POST'},
          'update': {method:'PUT'},
          'query':  {method:'GET', isArray:true},
          'remove': {method:'DELETE'},
          'delete': {method:'DELETE'}
        }
    );

    return {
        get: resource.get,
        create: resource.create,
        update: resource.update,
        query: resource.query,
        remove: resource.remove,
        delete: resource.delete
    }
}

即使是角度文档也无法为使用服务提供令人信服的理由。当服务最合适的时候,他们给出的例子是:(取自这里)

假设您有一个现有的构造函数

代码语言:javascript
复制
function UnicornLauncher(apiToken) {

  this.launchedCount = 0;
  this.launch = function() {
    // Make a request to the remote API and include the apiToken
    ...
    this.launchedCount++;
  }
}

工厂供应商看起来就像

代码语言:javascript
复制
myApp.factory('unicornLauncher', ["apiToken", function(apiToken) {
  return new UnicornLauncher(apiToken);
}]);

有了一项服务,你就可以把它变成一个单身汉。

代码语言:javascript
复制
myApp.service('unicornLauncher', ["apiToken", UnicornLauncher]);

对我来说并不是太令人兴奋,当然也不是一个好的理由让我去思考这到底是一种服务还是一种工厂。我的建议是忘记service()的存在,只使用工厂。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34317814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档