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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top