私はアーキテクチャで作業しています。Webクライアントおよびモバイルアプリ用のREST APIを提供する予定です。私はSpring(spring mvc、spring data jpaなど)を使用しています。ドメインモデルは、JPA仕様でコーディングされています。
クリーンアーキテクチャのいくつかの概念を適用しようとしています(https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html)。すべてではありません。これは、jpaドメインモデルを維持するためです。
レイヤーを通過する実際の流れは次のとおりです。
フロントエンド <-> APIサービス -> サービス -> リポジトリ -> DB
- フロントエンド:Webクライアント、モバイルアプリ
- APIサービス:Rest Controllers、ここではコンバーターとdtoと呼び出しサービスを使用しています
- サービス:実装とインターフェースし、ビジネスロジックを含みます
- リポジトリ:CRUD操作とおそらくいくつかのSQLクエリを含む自動実装(Spring Data JPAによって実行)とのリポジトリインターフェイス
私の疑問:サービスとリポジトリの間に追加のレイヤーを使用する必要がありますか?
私はこの新しいフローを計画しています:
フロントエンド <-> APIサービス -> サービス -> 永続性 -> リポジトリ -> DB
なぜこの永続化レイヤーを使用するのですか?クリーンアーキテクチャの記事で述べているように、不可知論的永続性レイヤーにアクセスするサービス実装(ビジネスロジックまたはユースケース)が欲しいです。また、リポジトリの使用を停止する場合など、別の「データアクセス」パターンを使用する場合は、変更は必要ありません。
class ProductServiceImpl implements ProductService {
ProductRepository productRepository;
void save(Product product) {
// do business logic
productRepository.save(product)
}
}
だから私はこのような永続化レイヤーを使うことを考えています:
class ProductServiceImpl implements ProductService {
ProductPersistence productPersistence;
void save(Product product) {
// do business logic
productPersistence.save(product)
}
}
そして、このような永続化レイヤーの実装:
class ProductPersistenceImpl implements ProductPersistence {
ProductRepository productRepository;
void save(Product product) {
productRepository.save(product)
}
}
永続化レイヤーの実装を変更するだけでよいので、サービスを変更せずに残しました。リポジトリがフレームワークに関連しているという事実と相まってください。
どう思いますか?ありがとう。