2016-06-04 14 views
7

Obecnie mam połączenia jak to wszystko nad moją trzech regulatorów:Dlaczego przenosić moje połączenia http do usługi?

$scope.getCurrentUser = function() { 
    $http.post("/Account/CurrentUser", {}, postOptions) 
     .then(function(data) { 
       var result = angular.fromJson(data.data); 
       if (result != null) { 
        $scope.currentUser = result.id; 
       } 
      }, 
      function(data) { 
       alert("Browser failed to get current user."); 
      }); 
}; 

widzę mnóstwo porad do hermetyzacji połączenia $http się z HttpService, czy coś takiego, ale to, że jest znacznie lepsza praktyka, aby powrócić obietnicę niż zwrócić dane. Jednak jeśli wrócę obietnicę, wszystkie z wyjątkiem jednej linii w moim kontrolera $http zmian połączeń, a cała logika czynienia z odpowiedzi pozostaje w moich kontrolerami, np:

$scope.getCurrentUser = function() { 
    RestService.post("/Account/CurrentUser", {}, postOptions) 
     .then(function(data) { 
       var result = angular.fromJson(data.data); 
       if (result != null) { 
        $scope.currentUser = result.id; 
       } 
      }, 
      function(data) { 
       alert("Browser failed to get current user."); 
      }); 
}; 

mógłbym stworzyć RestService dla każdej stronie serwera kontroler, ale to spowoduje wywołanie usługi podstawowej i podanie adresu URL mimo to.

+1

możliwy duplikat http://stackoverflow.com/questions/17646034/what-is-the-best-practice-for-making-an-ajax-call-in-angular-js – jbe

+0

Korzyści z usług: łatwe ponowne użycie kodu , łatwy kontroler i testowanie usług, łatwe kpiny z usług. – dfsq

Odpowiedz

2

Istnieje kilka powodów, dla których jest to dobra praktyka w nietrywialnych aplikacjach.

Korzystanie z pojedynczej usługi ogólnej i przekazywanie adresu URL oraz parametrów nie powoduje zwiększenia wartości, jaką zauważyłeś. Zamiast tego masz jedną metodę dla każdego typu pobierania, które musisz wykonać.

Niektóre zalety korzystania z usługi:

  • Re-usability. W przypadku prostej aplikacji może wystąpić jedno pobranie danych dla każdego kontrolera. Ale to może wkrótce się zmienić. Na przykład możesz mieć stronę listy produktów z getProducts i stronę szczegółów z getProductDetail. Ale chcesz dodać stronę sprzedaży, stronę kategorii lub wyświetlić powiązane produkty na stronie szczegółów. Mogą one wszystkie wykorzystywać oryginalny getProducts (z odpowiednimi parametrami).
  • Testowanie. Chcesz móc przetestować kontroler, niezależnie od zewnętrznego źródła danych. Pieczenie pobierania danych do kontrolera nie jest takie proste. Dzięki usłudze po prostu kpisz z usługi i możesz przetestować kontroler ze stabilnymi, znanymi danymi.
  • Łatwość utrzymania. Możesz zdecydować, że przy prostych usługach jest to podobna ilość kodu, aby po prostu umieścić wszystko w kontrolerze, nawet jeśli używasz go ponownie. Co się stanie, jeśli zmieni się ścieżka back-end? Teraz musisz zaktualizować go wszędzie, gdzie jest używany. Co się stanie, jeśli potrzebna jest dodatkowa logika do przetworzenia danych lub potrzebujesz dodatkowych danych z innym połączeniem? Za pomocą usługi dokonujesz zmiany w jednym miejscu. Dzięki niemu zapakowane do kontrolerów, masz więcej pracy do zrobienia.
  • Klarowność kodu. Chcesz, żeby twoje metody wykonywały jasne, konkretne rzeczy. Kontroler odpowiada za logikę wokół określonej części aplikacji. Dodanie w mechanice pobierania danych myli to. Na prostym przykładzie jedyną dodatkową logiką, której potrzebujesz, jest dekodowanie jsona. To nie jest złe, jeśli twój back-end zwraca dokładnie te dane, których potrzebują twoje kontrolery w dokładnie tym formacie, ale może tak nie być. Dzieląc kod, każda metoda może zrobić dobrze. Pozwól, aby usługa otrzymała dane i przekazała je do kontrolera w dokładnie właściwym formacie, a następnie niech kontroler to zrobi.
0

Wydaje się rozsądne, aby mieć swoją usługę wyglądać następująco:

app.factory('AccountService', function($http) { 
    return { 
     getCurrentUser: function(param1, param2) { 
      var postOptions = {}; // build the postOptions based on params here 
      return $http.post("/Account/CurrentUser", {}, postOptions) 
      .then(function(response) { 
       // do some common processing here 
      }); 
     } 
    }; 
}); 

następnie wywołanie tej metody będzie wyglądać w ten sposób:

$scope.getCurrentUser = function() { 
    AccountService.getCurrentUser(param1, param2) 
    .then(function(currentUser){ 
     // do your stuff here 
    }); 
}; 

która wygląda o wiele ładniejszy i pozwala uniknąć powtarzania URL usługi backend i postOptions zmienna konstrukcja w wielu kontrolerach.

+0

Muszę przyznać, że jestem bardzo niegrzeczny i deklaruję "postOptions" jako zmienną poziomu modułu, więc nie muszę jej konfigurować w każdym kontrolerze. – ProfK

+0

Inną rzeczą, która działa w ten sposób, jest to, że mój kontroler niekoniecznie musi być tym, który wywołuje punkt końcowy http. Wykonując abonowanie wywołania do usługi, możesz wtedy wywołać inne usługi i zastosować do nich niestandardową logikę - zanim dotrze do kontrolera, który ma zostać wyświetlony. –

2

Sterownik realizuje logikę prezentacji (działa jako model widoku w widoku modelu kątowego niezależnie od wzorca). Usługi prowadzą logikę biznesową (model). Jest to sprawdzony w boju separacja problemów i nieodłączna część dobrych praktyk OOP.

Cienkie kontrolery i usługi tłuszczu gwarantują, że jednostki aplikacji pozostaną wielokrotnego użytku, testowalne i możliwe do utrzymania.

Nie ma żadnej korzyści z zastąpienia $http przez RestService, jeśli są one tym samym. Właściwe oddzielenie logiki biznesowej od prezentacji ma być czymś podobnym do tego, co ma miejsce w takim przypadku: Dba o kondycjonowanie wyniku i zwraca obietnicę. getCurrentUser przekazuje obietnicę, aby w razie potrzeby mogła być powiązana (przy użyciu innej metody lub testu kontrolera).

+0

Przyjemne przypomnienie rozdzielenia spraw, podczas gdy ja ugrzęzłem, ucząc się nowych rzeczy. Jestem religijny o tym w zwykłych aplikacjach C#. – ProfK

0

Prosta. Napisz każdą funkcję jako usługę, aby móc jej ponownie użyć. Ponieważ jest to wywołanie asynchroniczne, użyj obietnicy kątowej, aby wysłać dane do kontrolera, zawijając je w obietnicę.

Powiązane problemy