Last active
August 29, 2015 14:19
-
-
Save RinatMullayanov/ae917b50fd1e606499ef to your computer and use it in GitHub Desktop.
https://github.com/angular/angular.js/blob/v1.3.15/src/auto/injector.js#L651 Provider is primary.
Factory is wrapper over provider.
Service is wrapper over factory.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//////////////////////////////////// | |
// $provider | |
//////////////////////////////////// | |
function supportObject(delegate) { | |
return function(key, value) { | |
if (isObject(key)) { | |
forEach(key, reverseParams(delegate)); | |
} else { | |
return delegate(key, value); | |
} | |
}; | |
} | |
function provider(name, provider_) { | |
assertNotHasOwnProperty(name, 'service'); | |
if (isFunction(provider_) || isArray(provider_)) { | |
provider_ = providerInjector.instantiate(provider_); | |
} | |
if (!provider_.$get) { | |
throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name); | |
} | |
return providerCache[name + providerSuffix] = provider_; | |
} | |
function enforceReturnValue(name, factory) { | |
return function enforcedReturnValue() { | |
var result = instanceInjector.invoke(factory, this); | |
if (isUndefined(result)) { | |
throw $injectorMinErr('undef', "Provider '{0}' must return a value from $get factory method.", name); | |
} | |
return result; | |
}; | |
} | |
function factory(name, factoryFn, enforce) { | |
return provider(name, { | |
$get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn | |
}); | |
} | |
function service(name, constructor) { | |
return factory(name, ['$injector', function($injector) { | |
return $injector.instantiate(constructor); | |
}]); | |
} | |
function value(name, val) { return factory(name, valueFn(val), false); } | |
function constant(name, value) { | |
assertNotHasOwnProperty(name, 'constant'); | |
providerCache[name] = value; | |
instanceCache[name] = value; | |
} | |
function decorator(serviceName, decorFn) { | |
var origProvider = providerInjector.get(serviceName + providerSuffix), | |
orig$get = origProvider.$get; | |
origProvider.$get = function() { | |
var origInstance = instanceInjector.invoke(orig$get, origProvider); | |
return instanceInjector.invoke(decorFn, null, {$delegate: origInstance}); | |
}; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment