2014-04-09 9 views
5

Ich habe einige verwandte Fragen durchgesehen, aber ich sehe immer noch nicht viel Unterschied zwischen dem Repository und einer Service-Schicht. Ich nehme an, das Beispiel sollte so aussehen, wenn nicht, bitte sag mir warum?Unterschied zwischen Repository und Service-Layer

public interface ProductRepository extends CrudRepository<Product, Long>{ 

    public List<Product> findByName(String name); 
    public List<Product> findByPrice(Double price); 
} 

public interface ProductService { 

    public List<Product> findAll(); 
    public Product findById(Long id); 
    public Product save(Product product); 
    public void delete(Product product); 
    public List<Product> findByName(String name); 
    public List<Product> findByPrice(Double price); 
} 

und die Umsetzung des Product würde die ProductRepository verwenden, um die Methoden zu implementieren. Wie ich aus http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html verstehe, werden die Abfragen für Methoden aus dem Repository automatisch generiert. In meinem Beispiel werden die Methoden im Repository und Service wiederholt, also bitte erläutern, was/warum geändert werden muss?

Antwort

0

Soweit ich weiß, ist das Repository für den direkten Zugriff auf die Datenbank gedacht. Dies ist, wo direkte Aufrufe an die gespeicherten Prozeduren oder was auch immer Ihr Datenspeichermechanismus sein wird.

Die Serviceebene ist die API für Ihre Daten. In der Regel gibt es eine Logikebene, die Sie hören würden, oder eine andere Abstraktionsebene zwischen dem Dienst und dem Repository.

Zum Beispiel würde eine Website eine Methode in Ihrem Dienst aufrufen. Ihr Dienst würde Ihr Repository aufrufen, um diese Daten abzurufen, dann würde Ihr Dienst sie irgendwie umwandeln (Objekte erstellen, dynamische Informationen basierend auf Geschäftsregeln usw. generieren) und diese dann an die Website zurückgeben.

+0

Nun, also in meinem Beispiel sind die rep und Service-Schichten korrekt? Und wenn ich Methoden wie validate (Produkt p) habe, sollte es in die Service-Schicht gehen? – April

+0

Es sieht gut aus für mich. Es ist schwer zu sagen, da sie nur Schnittstellen sind, aber basierend auf der Idee, dass Ihr Repo CrudRepo erweitert, von dem ich annahm, dass es einige Funktionen zum Speichern/Aktualisieren/Löschen hat, erscheint das korrekt. Wie für die Validierung, ja, würde ich dies auf der Service-Schicht getan haben. Normalerweise haben wir eine Zwischengeschäftslogik, die solche Dinge behandelt. So ruft zum Beispiel der Service die Geschäftslogik auf, die den Repo aufruft, aber das hängt von der Projektgröße ab. – JasonWilczak

4

Der Repository-Layer bietet Ihnen eine zusätzliche Abstraktionsebene über den Datenzugriff. Die Repository-Schicht legt grundlegende CRUD-Operationen offen.

Die Serviceschicht legt die Geschäftslogik offen, die das Repository verwendet.

Sie können eine ausführlichere Antwort lesen Sie hier: https://stackoverflow.com/a/5049454/1446006

1

Ein Repository ist ein Datenzugriffsmuster, bei dem die Datenübertragung Objekte werden in einem Repository-Objekt übergeben, die CRUD-Operationen verwaltet. Dieses Muster ist in Situationen nützlich, in denen sich der Mechanismus Ihres Datenzugriffs erheblich ändern kann - z. Sie erwarten unterschiedliche Datenspeicher wie Oracle in einer Implementierung und SQL Server oder sogar HADOOP in einer anderen.

Ein Service Layer ist ein Geschäftslogikmuster, das häufig in SaaS-Architekturen verwendet wird. Durch die Verwendung einer Service-Schicht können eine oder mehrere Präsentationsimplementierungen über eine gemeinsame Schnittstelle auf Ihre Geschäftslogik zugreifen. Wenn Sie beispielsweise möchten, dass Ihre Website über eine API verfügt, würden Sie eine Serviceschicht verwenden, um die allgemeine Back-End-Funktionalität zu implementieren, die sowohl der Standort als auch die API benötigen.

Die erste sollte hauptsächlich mit Datenzugriff und die letztere mit Geschäftslogik betroffen sein. Weder sind obligatorisch noch muss man den anderen begleiten. In einfachen Anwendungen können beide Muster von derselben Klasse implementiert werden.

3

Alle Ihre Geschäftslogik sollte in der Service-Schicht sein.

Jeder Zugriff auf die Datenbank (beliebiger Speicher) sollte zur Repository-Schicht gehen.

Nehmen wir ein Beispiel. Sie müssen eine Entität (Person) speichern. Bevor Sie die Person speichern, sollten Sie jedoch sicherstellen, dass der Vorname der Person noch nicht existiert.

Also sollte der Validierungsteil auf die Business-Schicht gehen.

im Service Layer

PersonRepository repository; 
public Person save(Person p){ 
    Person p = findByName(p.getName(); 
    if (p != null){ 
      return some customException(); 
    } 
    return repository.save(p); 
} 

public Person findByName(String name){ 
    return repository.findByName(name); 
} 

Und in Ihrer Repository-Schicht nur auf DB-Betrieb konzentrieren.

Sie könnten dies in Repository Layer selbst getan haben. Angenommen, Sie haben dies in Ihrem Repository implementiert, dann überprüft Ihre Speichermethode immer vor dem Speichern (einige Zeit, die Sie möglicherweise nicht tun müssen).