为所有持久性特定操作和所有域对象的接口创建简单的分层设计构建接口。然后针对这些而不是它们的具体实现进行编码。这样,很容易将 mongo 持久层换成不同的持久层,功能被组织起来,以便其他人可以轻松理解它,并且还可以针对接口而不是具体实现进行测试。你会有类似的东西:
- URL数据接口
- URLDataDTO 类(用于业务层)
- 持久化接口
- MongoPersistence 类(用于持久层)
我目前的项目做了类似的事情,也适用于 Mongo。持久层接口有类似“void put(URLData)”的方法。当调用 Mongo 实现时,从传入的 URLData 构造一个新的 MongoURLData,提取 DBObject 然后将其持久化。像“URLData get(String id);”这样的方法 反过来工作。Mongolayer 查询数据库并从 Mongo DBObjects 创建新的 URLDataDTO 对象。然后,Web 服务负责序列化/反序列化发送到客户端应用程序或从客户端应用程序接收的 DTO 对象。
我的 Mongo 域对象都继承自以下内容:
public abstract class MongoDO<T extends Object> {
DBObject dbobject = null;
public MongoDO(T dto) {
this.dbobject = new BasicDBObject();
};
public MongoDO(DBObject obj) {
this.setDBObject(obj);
};
public abstract T toDTO() throws StorageException;
public DBObject getDBObject() {
return dbobject;
}
public void setDBObject(DBObject obj) {
this.dbobject = obj;
}
public ObjectId getIdObject() {
return (ObjectId) this.getDBObject().get("_id");
}
public void setIdObject(ObjectId id) {
this.getDBObject().put("_id", id);
}
protected String getField(String field) {
if (dbobject.containsField(field) && dbobject.get(field) !=null) {
return dbobject.get(field).toString();
} else
return null;
}
protected void setField(String field, String value) {
dbobject.put(field, value);
}
}
一个示例Mongo
实现是:
public class MongoURLData extends MongoDO<URLData> implements URLData {
private static final String FIELD_SHORT_URL = "surl";
public String getShortUrl() {
return getField(FIELD_SHORT_URL);
}
public void setShortUrl(String shortUrl) {
setField(FIELD_SHORT_URL, shortUrl);
}
public URLData toDTO(){
URLDataDTO dto = new URLDataDTO();
dto.setShortURL(getShortURL);
return dto;
}
}