War es hilfreich?

Lösung

Die Konfiguration ist im Code anstelle von Konfigurationsdateien, die eine gültige Entscheidung für viele Szenarien ist.

Ja, bedeutet dies, dass Sie wieder aufbauen müssen (möglicherweise nur die Module), wenn Sie eine andere Art von Sanitär-Anwendung freigeben wollen - obwohl natürlich könnte man noch einige Konfigurationswerte von Befehlszeilenargumenten, Properties-Dateien bekommen etc wenn Sie wollen.

Wenn Sie regelmäßig Ihre Anwendung Sanitär ändern müssen und wollen nichts anderes als eine einzige Datei erneut bereit, Guice möglicherweise nicht für Sie sein. Wenn auf der anderen Seite der wichtigste Grund für die Verwendung von DI ist der Code klarer zu machen, und in der Produktion verwenden Sie immer wirklich die gleichen Sanitär (oder nahe genug), dann ist Guice eine gute Option - es gibt oft Bits Logik wollen Sie zu verwenden, wenn die Rohrleitungen Aussortieren sowieso, und Komponenten, die im allgemeinen schwer zu beschreiben / konstruieren deklarativ.

Verschiedene DI-Frameworks haben unterschiedliche Vorteile und Kompromisse -. Verwendung je nachdem, welche am besten geeignet für Ihre Anwendung ist

Andere Tipps

Es ist trivial boostrapping mit Konfigurationsdateien einzuführen, wenn Sie so geneigt sind. Wir verwenden Guice zusammen mit einem einfachen API, die Eigenschaftsdateien lädt, wo die Dinge gehen, dass wirklich parametriert werden müssen. Dies kann zusammen mit @Named Anmerkungen und solche, und natürlich können Sie einige conditionals in Module haben (obwohl es eine gute Idee ist, nicht zu über tun).

Dies ist ein Beispiel dafür, wie ein Teil unseres Bootstrapping eingerichtet ist:

public class MetModules extends AbstractModule {

    private static final Logger log = LoggerFactory.getLogger(MetModules.class);

    private final Settings settings;

    public MetModules(Settings settings) {
        this.settings = settings;
    }

    @Override
    protected void configure() {

        // common (stage independent modules) go here
        install(new CommandsModule());
        install(new ServletsModule());
        install(new DataBaseModule(settings));
        install(new JobsModule(settings));

        // any development/ production specific modules
        Stage stage = currentStage();
        if (Stage.DEVELOPMENT.equals(stage)) {
            configureForDevelopment();
        } else { // PRODUCTION
            configureForProduction();
        }
    }

    /**
     * Install modules that will be used in development.
     */
    private void configureForDevelopment() {

        // Mock implementation of email delivery that just logs it got a
        // message rather than trying to send it.
        install(new AbstractModule() {
            @Override
            protected void configure() {
                bind(Delivery.class).toInstance(new Delivery() {

                    public String deliver(MailMessageExchange exchange)
                            throws DeliveryException {
                        log.info("email message: "
                                + exchange.getMessage().getMailMessage()
                                + " to "
                                + Arrays.asList(exchange.getMessage()
                                        .getMailMessage().getTo())
                                + " (not sent)");
                        return "fooMessageId";
                    }
                });
            }
        });

        // local in-memory registry suffices
        install(new LocalServiceRegistryModule());

        // local in memory db implementations of services
        install(new LocalServicesModule());
    }

    /**
     * Install modules that will be used in production.
     */
    private void configureForProduction() {
        // we really only need this (error interception and audit logging)
        // in production
        install(new AopModule());
        install(new ZooKeeperServiceRegistryModule());      }
}

Wo Einstellungen ist es, was unsere Eigenschaften Dateien liest und so. Gerade jetzt Entwicklung / Produktion zusammen mit bestimmten Einstellungen außer Kraft, die für Implementierungen die Arbeit für uns zu tun scheint, aber wir konnten damit noch weiter gehen, wenn wir offensichtlich wollten.

Die meisten der DI-Konfiguration wird das gleiche von einem zum anderen Einsatz sein, so können sie sehr gut konfiguriert werden, um Code verwenden, die Konfiguration Guice macht, sehr knapp und Sie erhalten die Vorteile der Kompilierung Typprüfung, Refactoring-Tools, Code-Navigation etc.

Für die wenige Dinge, die von der Entwicklung zu einem anderen, wie die Datenbank-Benutzername und Kennwort-Konfiguration ändern, können Sie den benötigten Code selbst schreiben. Schreiben von Code, der die Konfigurationsdatei liest (vielleicht eine Eigenschaftendatei), die Parameter analysiert, und bindet sie in Ihrem Guice Module, so dass Ihre Anwendung den Zugang zu ihnen bekommt. Der Code, dass dafür nicht nehmen viele Zeilen Code benötigt wird.

Eine Menge Konfiguration in Guice ist implizit, über die @Inject Annotation. Ein großer Teil der Komplexität in Projekten kommt aus einer großen Anzahl von Projekt Artefakte. Java-Dateien, XML-Dateien, Eigenschaften von Dateien, Datenbanken, Parameter .. Guice versucht, einen Teil dieser Komplexität zu entfernen, indem nicht Konfigurationsdateien verwendet wird.

Neuverkabelung Ihre Anwendung ist bei der Kompilierung einfach. Höchstwahrscheinlich werden Sie müssen nur Ihre Modulklasse bearbeiten. Für die meisten Klassen handeled von Guice, werden Sie keine Config brauchen überhaupt, aber nur @Inject an den richtigen Stellen - Sie müssen nur etwas konfigurieren, wenn Sie zwei verschiedene Implementierungen der gleichen Schnittstelle haben - oder, wenn Sie Klassen injizieren wollen aus externe Bibliotheken mit Provider-Klassen.

Ich habe erstellt kürzlich folgendes Projekt.

http://code.google.com/p/guice-property- Injektor /

Es ist WIP aber erlaubt Laufzeit Injektion von Eigenschaften aus einer Eigenschaftsdatei auf Umgebung ab.

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