我不會假裝知道到底我們的最佳實踐是什麼,但是這是我怎麼會做它,考慮您的設計目標。相反,A和B的,說我們有一個文件對象,你的骨料,其中包含許多行:
class File {
public void addLine(Line l) {/* implementation here*/}
public void removeLine(Line l) {/* implementation here*/}
}
class Line {
}
讓你的閱讀器/處理器返回LineOperations,封裝你行(你剛纔讀)和是否你正在做添加/刪除/其他:
的AddOperation的
interface LineOperation {
public void execute(File file);
}
class DeleteOperation implements LineOperation {
private Line line;
private DeleteOperation(Line line) {
super();
this.line = line;
}
public void execute(File file) {
file.removeLine(line);
}
}
實現和其他任何你可能需要留給了想象力。
接下來,我們將把LineOperations傳遞給您的作者。您的編寫者在集合文件上執行操作,然後使用FileRepository編寫集合。
class LineOperationWriter implements ItemWriter<LineOperation>, StepExecutionListener {
@Autowired;
FileRepository fileRepo;
private Long fileId;
public void write(List<? extends LineOperation> items) throws Exception {
File file = fileRepo.find(fileId);
for (LineOperation lineOperation : items) {
lineOperation.execute(file);
}
fileRepo.persist(file);
}
@Override
public void beforeStep(StepExecution stepExecution) {
this.fileId = (Long) stepExecution.getJobExecution().getExecutionContext().get("fileId");
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
return null;
}
}
希望這會有所幫助。
你用什麼爲你的數據訪問層? Spring Batch集成了幾個開箱即用的功能,並且可以通過使用ItemWriterAdapter輕鬆地適應其他人。 – 2012-04-16 13:55:52
A是一個聚合根,所以我有一個ARepository。我已經使用Hibernate實現了存儲庫。但正如我所說,我不認爲我應該使用HibernateWriter,因爲我不能直接與數據庫通信,所以我應該只與域模型通信。 – 2012-04-16 14:17:05