Wie verziert Objekte in Dependency Injection-Frameworks (PicoContainer) registrieren?
-
20-09-2019 - |
Frage
Ich möchte eine Reihe von Klassen wickeln Sie die Job-Schnittstelle mit einem JobEnabledDecorator Objekt implementieren, ob oder ob nicht bestimmt sie ausgeführt wird.
Ich habe Probleme, herauszufinden, wie dies in PicoContainer zu konfigurieren, so dass es die Aufgabe Implementierung Objekte mit einer JobEnabledDecorator Verpackung, sie zu schaffen weiß.
Ist das möglich in Dependency Injection-Frameworks?
Ist es möglich, in PicoContainer?
Wenn ja, würde jede mögliche Hilfe geschätzt.
Lösung
Sie werden wahrscheinlich ein hinzufügen mögen „Verhalten.“ Die kurze Geschichte ist, benötigen Sie ein Verhalten Fabrik zu registrieren, die Verhaltensweisen erzeugt, die Ihre Komponente Adapter wickeln. Es ist einfacher, wenn man zu Fuß durch ein Beispiel zu beschreiben.
Als erstes wollen Sie einen Container erstellen, so etwas wie so.
final MutablePicoContainer container = new PicoBuilder()
.withBehaviors(new JobEnabledDecorating())
.build();
Das bedeutet, dass, sobald das Grundobjekt erstellt wird - in Ihrem Fall die Job
- Sie wollen etwas extra, um es hinzuzufügen. Es gibt eine Reihe von Einbau-Verhalten, aber Sie wollen Ihre eigenen. JobEnabledDecorating
public class JobEnabledDecorating extends AbstractBehaviorFactory {
@Override
public ComponentAdapter createComponentAdapter(
final ComponentMonitor componentMonitor, final LifecycleStrategy lifecycleStrategy,
final Properties componentProperties, final Object componentKey,
final Class componentImplementation, final Parameter... parameters) throws PicoCompositionException
{
return componentMonitor.newBehavior(
new JobEnabledDecorated(
super.createComponentAdapter(
componentMonitor, lifecycleStrategy, componentProperties,
componentKey, componentImplementation, parameters
)
)
);
}
}
Die Fabrik erzeugt JobEnabledDecorated
Verhalten durch den Geräteadapter Einwickeln, was wiederum Ihre Instanzen geben. Die eigentliche Arbeit wird nun in diesem Verhalten getan.
public class JobEnabledDecorated extends AbstractBehavior<Job> {
public JobEnabledDecorated(final ComponentAdapter<Job> delegate) {
super(delegate);
}
@Override
public Job getComponentInstance(final PicoContainer container, final Type into)
throws PicoCompositionException {
final Job instance = super.getComponentInstance(container, into);
return new JobEnabledDecorator(instance);
}
@Override
public String getDescriptor() {
return "JobEnabledDecorator-";
}
}
getComponentInstance
fragt für den Job, fügt die Dekorateur und gibt dieses gewickelte Objekt als neue Instanz. Du musst hier Ihre eigene Logik hinzuzufügen.
public interface Job {
void execute();
}
public class JobEnabledDecorator implements Job {
private Job delegate;
public JobEnabledDecorator(final Job delegate) {
this.delegate = delegate;
}
@Override
public void execute() {
System.out.println("before");
delegate.execute();
System.out.println("after");
}
}
public class MyJob implements Job {
@Override
public void execute() {
System.out.println("execute");
}
}
Zurück zu unserer Container-Nutzung, betrachten Sie dieses Beispiel.
final MutablePicoContainer container = new PicoBuilder()
.withBehaviors(new JobEnabledDecorating())
.build();
container.addComponent(Job.class, MyJob.class);
final Job job = container.getComponent(Job.class);
job.execute();
das Lauf druckt:
before
execute
after
Dies ist natürlich, weil der Behälter Ihnen Objekt einer JobEnabledDecorator(MyJob)
geben.