2016-01-21 4 views
0

Я ищу способ добавить IOC в мое приложение angularjs.IOC in AngularJS (1.x) - Как я могу достичь?

Мое приложение - это приложение с несколькими арендаторами, и мне нужно использовать разные услуги для разных арендаторов с тем же регистрационным именем.

Я также использую TypeScript, и он хорошо работает с использованием конкретных типов по интерфейсам.

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

Это пример:

var app = angular.module('app',[]); 

// common registrations 
app.service('commonService1', commonServiceFunction1); 
app.service('commonService2', commonServiceFunction2); 
app.service('commonService3', commonServiceFunction3); 
app.service('commonService4', commonServiceFunction4); 

// here I want to register the same service name with a different implementation 
app.service('serviceName', serviceOneFunction); // sometimes I will need this service 
app.service('serviceName', serviceTwoFunction); // sometimes I will need this service 

Вещи, которые я думал:

  1. Добавьте логику и скачать правильные JS файлов в источник - имена функций останутся неизменными, и мне нужно будет выяснить способ предоставления правильного js-файла, который включает в себя правильные функции.

  2. Переопределить регистрацию (например, зарегистрировать общую службу, а затем переопределить регистрацию с конкретной реализацией).

Оба решения уродливые и не масштабируемые для меня.

Я хотел бы иметь контейнер IOC или какое-либо другое решение, которое будет немного более приятным и масштабируемым.

+0

Какие критерии используются для определения того, какой сервис вам нужен? Должны ли быть определены службы для каждого приложения или вам нужно динамически их менять? –

+0

Услуги необходимо будет изменить в конфигурации. Поскольку я хочу зарегистрировать правильный сервис в своем приложении, я не буду изменять эту регистрацию во время использования моего приложения. –

ответ

0

Надеюсь, это поможет вам. Попробуйте использовать угловой завод.

angular.module('app').factory('tenantService', function() { 
    var tenantService = undefined; 

    if(tenantType == "1"){ 
    tenantService = new TenantService1(); 
    } else if(tenantType == "2"){ 
    tenantService = new TenantService2(); 
    } else { 
    tenantService = new TenantDefService(); 
    } 
    return tenantService; 
}); 
+0

Это самый простой способ добиться того, что я хочу - но это не масштабируется, и для этого потребуется специальное лечение для каждого арендатора x. Спасибо, в любом случае. –

1

Если я правильно понял вопрос, вы можете зарегистрировать сервисы (которые фактически являются поставщиками) в качестве поставщика, который вы настраиваете на этапе угловой конфигурации. Таким образом, это может выглядеть следующим образом:

var app = angular.module('app',[]); 

// common registrations 
app.service('commonService1', commonServiceFunction1); 
app.service('commonService2', commonServiceFunction2); 
app.service('commonService3', commonServiceFunction3); 
app.service('commonService4', commonServiceFunction4); 

app.provider('serviceName', function ServiceNameProvider() { 
    var service = DefaultService; 

    this.setService = function(newService) { 
     service = newService 
    } 

    this.$get = [function() { 
     return service; 
    }]; 
}); 

app.config(["serviceNameProvider", function(serviceNameProvider) { 
    if(someCondition) { 
     serviceNameProvider.setService(ServiceImpl1); 
    } else { 
     serviceNameProvider.setService(ServiceImpl2); 
    } 
}]); 

Услуги, завод просто синтаксический сахар над поставщиком. Вы можете определить свою сервисную функцию на этапе конфигурации угловой. ServiceImpl1, ServiceImpl2 - это просто функции, но вы можете использовать там инъекцию зависимости, поскольку они будут вызываться провайдером with $injector.invoke. Read about providers

+0

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

+0

В любом случае вам нужно иметь специальную обработку для каждого арендатора, это может быть конфигурация для IoC или провайдера. Не можете ли вы делегировать эту часть для создания процесса и загрузки разных модулей с услугами, зависит от флага сборки? –

+0

Я подумывал о том, чтобы как-то загрузить конфигурацию json, которая фактически сконфигурировала бы контейнер ioc и подключилась бы к угловому резольверу. –

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