我有一个工厂,它提供对资源对象的访问,如下所示。最初,我在一个控制器中实现了这个功能,但是我把它移到了一个工厂,使它在我的整个应用程序中更加可重用。
当我在构建它的时候,关于提供者的一条直线吸引了我的眼球:
最佳实践:将工厂功能命名为工厂(例如,apiTokenFactory)。虽然这个命名约定不是必需的,但它有助于在调试器中导航代码库或查看堆栈跟踪。(来源)
我显然不会在下面这样做(因为我遵循的是资源Doc的模式)。但后来我想弄清楚这是什么类型的提供者,我不确定,他们不包括任何其他类型的提供商详细的最佳实践说明。我应该使用service()而不是factory()吗?(我真的找不到明确的答案。)
这个问题显然风险很小,因为应用程序运行得很好(比我不使用工厂时更好)。但我对意见很好奇。
...
.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'}
}
);
}发布于 2015-12-16 18:31:18
如果它是一家工厂,就把它当作一家工厂。我从不使用服务提供者,因为我发现它没有提供任何超过工厂方法的东西,而且我的大脑更容易理解工厂模式。
对于工厂,您提供了一个函数,返回您希望角的注入器使用的对象。对于服务,您可以提供一个构造函数。然后,注入器创建将通过使用提供的函数向对象注入的对象。角工厂的和服务的总是单一的,所以提供一个构造函数来增加一个单一的对象,对我来说似乎有点过分了。
在您的情况下,如果您将其转换为服务,则您的对象基本上只是充当代理,如下所示
...
.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,否则这是没有意义的,同样,你也可以用一个工厂做同样容易的事情。
...
.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
}
}即使是角度文档也无法为使用服务提供令人信服的理由。当服务最合适的时候,他们给出的例子是:(取自这里)
假设您有一个现有的构造函数
function UnicornLauncher(apiToken) {
this.launchedCount = 0;
this.launch = function() {
// Make a request to the remote API and include the apiToken
...
this.launchedCount++;
}
}工厂供应商看起来就像
myApp.factory('unicornLauncher', ["apiToken", function(apiToken) {
return new UnicornLauncher(apiToken);
}]);有了一项服务,你就可以把它变成一个单身汉。
myApp.service('unicornLauncher', ["apiToken", UnicornLauncher]);对我来说并不是太令人兴奋,当然也不是一个好的理由让我去思考这到底是一种服务还是一种工厂。我的建议是忘记service()的存在,只使用工厂。
https://stackoverflow.com/questions/34317814
复制相似问题