2009-11-03 14 views
5

In meiner SOA-Architektur habe ich mehrere WCF-Dienste.
Alle meine Dienste müssen auf die Datenbank zugreifen.

Soll ich einen spezialisierten WCF-Dienst erstellen, der für den gesamten Datenbankzugriff zuständig ist?
Oder ist es in Ordnung, wenn jeder meiner Dienste einen eigenen Datenbankzugriff hat?
SOA-Architektur Datenzugriff

In einer Version, ich habe nur eine Schicht Entity instanzierten in einem Dienst, und alle anderen Dienste dieser Dienst auf abhängen.
In der anderen ist der Entity-Layer in jedem meiner Dienste dupliziert.

Der Hauptnachteil der ersten Version ist die Kopplung induziert.
Der Nachteil der anderen Version ist die Schicht Duplizierung, und vielleicht SOA schlechte Praxis?

Also, was denken so gute Leute von Stack Overflow?

Antwort

6

Nur meine persönliche Meinung, wenn Sie einen Dienst für den gesamten Datenbankzugriff erstellen, dann hängen mehrere Dienste von EINEM Dienst ab, der Art von SOA (d. H. Dienste sind autonom), wie Sie artikuliert haben. Wenn Sie von Layer-Duplizierung sprechen, wenn jeder Service seine eigenen Daten zu behandeln hat, ist es wirklich Duplizierung. Ich weiß, dass Sie wahrscheinlich die gleichen Mittel zur Interaktion mit Ihren relationalen Datenbanken haben oder zurück von OOA, da Sie eine gemeinsame Klassenbibliothek hatten, die den Datenzugriff für Sie verkapselt hat. Dies ist eines der Dinge, mit denen ich selbst Schwierigkeiten habe, aber ich sehe kein Problem darin, dass jeder Dienst seine eigene Datenschicht hat. In der Tat, in Michele Bustamante's book (Kapitel 1 - Seite 8) - sie zeigt dies tatsächlich und fügt "Dienste kapseln Business-Komponenten und Datenzugriff". Wenn Sie bemerken, dass jeder Dienst eine separate DALC-Schicht hat. Das ist eine gute Frage.

+0

Ich ging in die gleiche Richtung, abgesehen davon, dass er einen Teil seiner DAO-Schicht hat, die alle WCF-Dienste von der Freigabe abhängig sind. Daher scheint es nicht zu funktionieren, bis er seinen Datenbankcode repariert . –

+1

Das Problem ist, dass ich Probleme habe, die Datenbank in Bits zu teilen. Einige Tabellen in dieser Datenbank werden von allen WCF-Diensten benötigt. Zum Beispiel habe ich einen Dienst, der dafür verantwortlich ist, Warnungen von Fahrzeug-GPS-Positionen zu erheben. So habe ich Tabellen, die die Warnungen beschreiben, aber auch Tabelle, die Warnungen und Fahrzeuge assoziiert, und natürlich einen Vehicule-Tisch. Ich habe einen anderen Dienst, der für das Parsen der GPS-Position verantwortlich ist, dann benötigt er die Tabelle Vehicule und eine GPS-Positionstabelle. In der Tat habe ich "Kern" -Tabellen wie Vehicule, Benutzer, Flotte, von allen Diensten benötigt. Weiß nicht, wie man spaltet ... – Roubachof

2

Warum verwenden Sie nicht einfach ein Dependency-Injection-Framework, und wenn sie derzeit die gleiche Datenbank verwenden, dann erlauben Sie ihnen, den gleichen Code zu teilen, und wenn diese im selben Projekt wären, würden sie alle dieselbe DLL verwenden .

Auf diese Weise können Sie später, wenn Sie Code einfügen müssen, den die anderen nicht freigeben sollen, Änderungen vornehmen und einfach eine neue DAO-Ebene erstellen.

Wenn es ein bestimmtes Singleton gibt, das alle verwenden, dann können Sie es einfach injizieren, wenn Sie in die Dao-Schicht injizieren.

Dies erfordert jedoch, dass sie den gleichen DI-Framework-Controller verwenden.

5

Es klingt, als ob Sie mehrere Dienste haben, aber eine einzige Datenbank.

Wenn dies korrekt ist, haben Sie nicht wirklich eine reine SOA-Architektur, da die Dienste nicht unabhängig sind. (Es ist nichts falsch daran, keine reine SOA-Architektur zu haben, es kann oft die richtige Wahl sein)

Das Hinzufügen einer zusätzlichen WCF-Schicht würde Ihre Lösung nur verkomplizieren und verlangsamen.

Ich würde empfehlen, dass Sie eine einzelne Datenzugriffsdll erstellen, die den gesamten Datenzugriff enthält und von jedem WCF-Dienst referenziert wird. Auf diese Weise haben Sie keine Codeverdopplung. Da Sie über eine einzige Datenbank verfügen, würde jede Änderung der Datenbank/des Datenlayers in jedem Fall eine Umschichtung aller Dienste erfordern.

1

Der wahre Gewinn, den SOA bringt, ist, dass es die Anzahl der Verknüpfungen zwischen den Anwendungen reduziert.

In der Vergangenheit habe ich mit Organisationen gearbeitet, die es auf viele verschiedene Arten gemacht haben. Einige Datenlayer sind integriert und einige sind abstrahiert.

Die Art und Weise, wie ich es am erfolgreichsten gesehen habe, ist, wenn Sie generische Data-Layer-Dienste für jede App/Datenbank erstellen und die Dienste auf höherer Ebene basierend auf Ihrer neu erstellten Datenschicht erstellen.