https://github.com/google/guice-aqueduct
Guice binder to configure Chained instances to form a pipeline
https://github.com/google/guice-aqueduct
dependency-injection guice java pipeline
Last synced: 6 months ago
JSON representation
Guice binder to configure Chained instances to form a pipeline
- Host: GitHub
- URL: https://github.com/google/guice-aqueduct
- Owner: google
- License: apache-2.0
- Archived: true
- Created: 2018-02-21T17:55:19.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2021-06-24T18:57:22.000Z (about 5 years ago)
- Last Synced: 2025-12-09T12:12:31.727Z (7 months ago)
- Topics: dependency-injection, guice, java, pipeline
- Language: Java
- Homepage:
- Size: 18.6 KB
- Stars: 11
- Watchers: 1
- Forks: 4
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
# Guice Aqueduct
Guice Aqueduct is a Guice binder to configure `Chained` instances to form a pipeline. For each `Chained` item, next in pipeline will be set via `Chained.setNext` call at injection time. For the last item in line, `noOp` instance configured from the constructor will be set as the next item.
For example, suppose we have a `Chained` pipeline class:
```java
abstract class Pipeline implements Chained {
Pipeline next;
@Override
public void setNext(Pipeline next) {
this.next = next;
}
abstract void process();
}
class PipelineA extends Pipeline {
@Override
void process() {
// Pre-process logic.
next.process();
// Post-process logic.
}
}
class PipelineB extends Pipeline {
@Override
void process() {
// Pre-process logic.
next.process();
// Post-process logic.
}
}
class NoOpPipeline extends Pipeline {
@Override
void process() {
// No-Op terminal node. this.next here will not have been set.
}
}
```
Now, when we inject a pipeline through the following calls inside a module:
```java
class MyPipelineModule extends AbstractModule {
@Override
protected void configure() {
PipelineBinder myPipelineBinder = new PipelineBinder<>(
binder(), TypeLiteral.get(Pipeline.class), new NoOpPipeline());
myPipelineBinder.addBinding().to(PipelineA.class);
myPipelineBinder.addBinding().to(PipelineB.class);
}
}
```
The injected `Pipeline` instance will be an instance of `PipelineA`, whose `next` value is an instance of `PipelineB`, followed by `NoOpPipeline`.
Note that instead of implementing `Chained.setNext`, one could extend `AbstractPipeline` which does the same thing as what `Pipeline` class does in the example above.
Disclaimer: This is not an official Google product.