gpt4 book ai didi

java - 使应用层松散耦合

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:53 26 4
gpt4 key购买 nike

我有一个 Java Spring-boot 应用程序,它有层():

  • Controller ( Controller 类)
  • 服务(业务逻辑)
  • 领域(数据库层)

在我的中,我有两个数据库类

  • MysqlDBManager
  • MongoDBManager

我的服务包中有很多类,它们使用MysqlDBManagerMongoDBManager 的方法。

如果我在我的服务类上直接使用MysqlDBManager'和MongoDBManager`的实例,那么服务层将与紧密耦合

为了解决这个问题,我在我的 domain 包中创建了一个名为 **DBManager** 的类,它作为一个代理类调用 MysqlDBManager' 和MongoDBManager` 基于内部用例。

现在服务层,不是直接调用MysqlDBManager'和MongoDBManager而是调用DBManager,它在内部调用MysqlDBManager'和MongoDBManager

因此,现在我的服务类并没有与领域层紧密耦合。

下面是我的类,类似于我的用例。

MongoDBManager 类:

 Class  MongoDBManager {
public saveUserDocs(String docs) {
//.....
}
}

MysqlDBManager 类:

Class  MysqlDBManager {
public saveUserData(List<String> rows) {
//.....
}
}

DBManager 类:

 Class  DBManager {

@Autowired
private MysqlDBManager mysqlDBManager;
@Autowired
private MongoDBManager mongoDBManager;

public saveUserData(List<String> rows) {
mysqlDBManager.saveUserData(rows);
}

public saveUserDocs(String docs) {
mongoDBManager.saveUserDocs(docs);
}
}

服务等级:

class Service {
@Autowired
private DBManager dBManager;

//....... code here
dBManager.saveUserData(rows);
dBManager.saveUserDocs(docs);
}

我的问题是:

这是(如上所述)使我的应用程序层松散耦合的好方法,还是它们存在更好的方法来做到这一点?

最佳答案

你的方法很好,它看起来像某种 Facade 设计模式,但我会推荐更传统的方法。

您已经将 spring 作为 IoC 容器,因此您所要做的就是从您的 *DBManager 类中提取接口(interface),并将您的实现告诉 spring。然后您将能够使用一个接口(interface)注入(inject)一个实际的实现,而这个接口(interface)又可能驻留在一个完全不同的包中。因此耦合将不复存在。

这是一个例子。

数据存储合约:

package root;

import java.util.List;

public interface UserDataStorage {
void saveUserData(List<String> rows);
}

文档存储合约:

package root;

public interface UserDocumentStorage {
void saveUserDocs(String docs);
}

数据存储实现:

package root.domain;

import org.springframework.stereotype.Service;
import root.UserDataStorage;

import java.util.List;

@Service
public class MysqlDBManager implements UserDataStorage {
@Override
public void saveUserData(List<String> rows) {
System.out.println("Saving data....");
}
}

文档存储实现:

package root.domain;

import org.springframework.stereotype.Service;
import root.UserDocumentStorage;

@Service
public class MongoDBManager implements UserDocumentStorage {
@Override
public void saveUserDocs(String docs) {
System.out.println("Saving docs....");
}
}

那么你的服务类可能看起来像这样(请注意没有引用 domain 包:

package root.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import root.UserDataStorage;
import root.UserDocumentStorage;

import java.util.Collections;

@Service
public class MyService {

private final UserDataStorage dataStorage;
private final UserDocumentStorage documentStorage;

@Autowired
public MyService(UserDataStorage dataStorage, UserDocumentStorage documentStorage) {
this.dataStorage = dataStorage;
this.documentStorage = documentStorage;
}

public void callMe() {
this.dataStorage.saveUserData(Collections.emptyList());
this.documentStorage.saveUserDocs("Document1");
}
}

关于java - 使应用层松散耦合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46661272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com