2015-02-16 2 views
4

Я использую service, где должен быть factory, и я не получаю сообщение об ошибке. Мой сервис возвращает и объект, когда он должен возвращать функцию-конструктор.
Но мой код работает отлично.Использование угловых заводов и услуг взаимозаменяемо - нет ошибки

например, код ниже не должен работать. Но она отлично работает:

angular.module('myApp', []) 
    .service('myService', myService); 

function myService(/*<dependencies go in here>*/){ 
    return { 
    /*<object attributes in here>*/ 
    } 
} 

Правильный код должен быть таким:

angular.module('myApp', []) 
    .factory('myService', myService); 

function myService(/*<dependencies go in here>*/){ 
    return { 
    /*<object attributes in here>*/ 
    } 
} 

Мой вопрос, почему угловой позволяет использовать .service, когда вы на самом деле возвращения объекта и должны использовать .factory

+1

Это один из интересного вопроса –

ответ

4

OK Это мой ответ на этот интересный вопрос.

Прежде всего позволяет убедиться, что мы понимаем, основное различие между службой и заводом, будет легче после того, как мы видим, обе реализации:

Factory:

function factory(name, factoryFn) { 
    return provider(name, { $get: factoryFn }); 
} 

Услуги:

function service(name, constructor) { 
    return factory(name, ['$injector', function($injector) { 
     return $injector.instantiate(constructor); 
    }]); 
} 

Как мы можем видеть, что фабрика фактически делает, мы получаем объект, возвращаемый фабричными функциями.

Служба с другой стороны создает новый объект, используя предоставленную конструкторскую функцию. Излишне говорить, что оба являются одиночными.

В вашем примере выше завод используется так, как должно быть, это лучшая практика. Я думаю, интересная часть заключается в том, почему служба работает, а его функция-конструктор не определяет класс, но возвращает объект.

Здесь сложная часть, она работает, потому что, как сказано перед использованием службы, фактически создающей объект, в нашей плохой практике мы переопределяем конструктор по умолчанию с помощью нового конструктора.

Звучит непонятно? вот Fiddle, который выполняет в основном то же самое, мы используем новый ConstructorFunc(), а ConstructorFunc() вместо определения объекта и создания его свойств, используя this.prop = что-то возвращает объект.

Возможно, это не лучшая практика, но это возможно. Я думаю, что нам лучше продолжать работать с сервисом, как мы привыкли придерживаться конвенции.

Интересная статья factory vs service vs provider

+1

Вы говорите: «Это плохая практика, но это возможно». Функция-конструктор возвращает объект. Почему это плохо в угловом? – raneshu

+1

Я согласен, что говорить о плохой практике немного жестко, потому что «Фабрика» и «Сервис» почти одинаковы. Создание сервиса выполняется путем создания фабрики. Как мне кажется, это не лучшая практика, потому что: во-первых, есть некоторые соглашения, которые создают общую основу. Если разработчики привыкли работать в определенных соглашениях, проще передавать \ передавать код от одного к другому. Во-вторых, я не вижу необходимости переопределять конструктор, если для этого созданы фабрики. –

3

Явный возврат в службу переопределяет поведение конструктора по умолчанию.

function factory() { 

    return { 
     foo: 'bar' 
    }; 

} 

console.log(factory().foo); // bar 

function service() { 

    this.foo = 'foo'; 

    return { 
     foo: 'bar' 
    }; 

} 

console.log(new service().foo); // bar 

Fiddle

+0

начал писать свой ответ перед пилой ваших, вы правы, а :) Я надеюсь, что фон я дал не был избыточным и запутанным. У тебя есть стрела. –

+0

Отличный ответ! Это считается плохой практикой для службы, чтобы вернуть объект? И если да, то почему? – raneshu

+1

Да, это плохая практика, чтобы вернуть объектный литерал из службы. Это вопрос семантики; различие между службами и фабриками заключается в том, что сервисы создаются методом Углового с использованием 'new'. Если вы явно возвращаете объект из «службы», вы фактически создаете фабрику, а не службу. – pdoherty926

Смежные вопросы