Angular JS: ¿por qué la diferencia entre la inyección de módulo.config y la inyección de controlador?

Esto es algo que no pude averiguar al profundizar en el código de AngularJS, tal vez puedas ayudar a resolver el misterio.

Para mostrarlo, agregué un servicio al proyecto semilla de AngularJS:

function MyServiceProvider() {
    console.log('its my service');
    this.providerMethod = providerMethod;

    function providerMethod() {
        console.log('its my service.providerMethod');
    }

    this.$get = $get;

    function $get() {
        var innerInjectable = {
             name: 'stam'
        };
        return innerInjectable;
    }
}

var serviceModule = angular.module('myApp.services', []).
    value('version', '0.1').
    provider('myservice',MyServiceProvider);

Puede ver que este proveedor expone $ get y un determinado 'método de proveedor'.

Ahora, para el uso de la inyección: si llamamos configuración, podemos inyectar a toda la clase y obtener acceso al método del proveedor "externo":

serviceModule.config(function(myserviceProvider) {
    console.log('myServiceProvider:',myserviceProvider);
    myserviceProvider.providerMethod();
});

Pero cuando inyectamos esto a un controlador (note el nombre sin Proveedor), solo se expone el valor de retorno de $ get:

function MyCtrl1(myservice) {
    console.log('MyCtrl1.myservice =',myservice,myservice.name);
}
MyCtrl1.$inject = ['myservice'];

La salida de la consola sigue como debería: es mi servicio myServiceProvider: Constructor {providerMethod: function, $ get: function} es my service.providerMethod MyCtrl1.myservice = Object {name: "stam"} stam

¿Alguien puede explicar la diferencia? ¿La razón? muchas gracias por cualquier pensamiento

Lior

PD: He visto esta técnica en ui angular.nuevo ui-router (excelente proyecto!). Necesito acceso a la clase del proveedor externo para hacer la inyección en jazmín y otros lugares, sin éxito.

Respuestas a la pregunta(2)

Su respuesta a la pregunta