Hi guys, no objections have been shown, I am going to checkin the proposed modifications.
Thanks a lot for participating in the discussion! -Simo http://people.apache.org/~simonetripodi/ http://simonetripodi.livejournal.com/ http://twitter.com/simonetripodi http://www.99soft.org/ On Sun, Jan 13, 2013 at 5:08 PM, Simone Tripodi <[email protected]> wrote: > Hi all again, > > I maybe found the solution to that issue and proposed a patch on ONAMI-51. > Please review, if there are no objections I intend to commit it. > > I would like also to bump to a major release and break the binary > compatibility, since the previous version is quiet useless :) > > Many thanks in advance, all the best! > -Simo > > http://people.apache.org/~simonetripodi/ > http://simonetripodi.livejournal.com/ > http://twitter.com/simonetripodi > http://www.99soft.org/ > > > On Thu, Jan 10, 2013 at 9:51 PM, Simone Tripodi > <[email protected]> wrote: >> Hi all guys, >> >> I think the main idea of services binding[1] in SPI is good but still >> a little far to be complete, because what they miss are *qualifiers*, >> I mean, Guice allows binding the same interface/service to multiple >> instances by qualifying them via annotations, i.e. >> >> bind(CreditCardProcessor.class).annotatedWith(Names.named("Visa")).to(VisaCreditCardProcessor.class); >> bind(CreditCardProcessor.class).annotatedWith(Names.named("Mastercard")).to(MastercardCreditCardProcessor.class); >> >> So users can require service injection depending on bound metadata, >> rather than requiring and explicit class implementation: >> >> @Inject >> @Named("Visa") >> CreditCardProcessor creditCardProcessor; >> >> Now, coming back to the current SPI implementation, it just allows >> doing silly bindings, such as bind the service to the first discovered >> implementation or getting all the discovered implementations, mainly >> because META-INF/services files just enlist service implementation, >> i.e. >> >> file META-INF/services/org.acme.CreditCardProcessor >> ----------------------------------------------------------------- >> org.acme.VisaCreditCardProcessor >> org.acme.MastercardCreditCardProcessor >> >> There are not qualifiers :( While at the time of coding the first >> version of SPI it made me happy, now I am not longer satisfied. >> >> We can do something better, my proposal is: >> >> * allows specifying a set of metadata - please remind that qualifiers, >> binding annotations, can be more complex rather than just @Named - in >> META-INF/services files for each service, something like >> >> file META-INF/services/org.acme.CreditCardProcessor >> ----------------------------------------------------------------- >> org.acme.VisaCreditCardProcessor; type=Visa; version=1.0.0; >> org.acme.MastercardCreditCardProcessor; type=Mastercard; version=1.5.0; >> >> * defining a new binding annotation, something like: >> >> @Documented >> @Retention( RetentionPolicy.RUNTIME ) >> public @interface Property >> { >> >> String name(); >> >> String value(); >> >> @Documented >> @BindingAnnotation >> @Retention( RetentionPolicy.RUNTIME ) >> @Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD }) >> @interface List >> { >> Property[] value(); >> } >> >> } >> >> in order users can request injections specifying injections like: >> >> @Inject >> @Property.List({ >> @Property( name="type", value="Visa" ), >> @Property( name="version", value="1.0.0" ) >> }) >> CreditCardProcessor creditCardProcessor; >> >> WDYT? Do you have any idea? >> Many thanks in advance! >> -Simo >> >> [1] http://onami.incubator.apache.org/spi/services.html >> >> http://people.apache.org/~simonetripodi/ >> http://simonetripodi.livejournal.com/ >> http://twitter.com/simonetripodi >> http://www.99soft.org/
