Guice will generate the provider for you automatically, based off the binding to LogFileEntry.
On Aug 14, 7:18 pm, Brandon Atkinson <[email protected]> wrote: > The point of confusion might be that you're expecting Guice to generate a > Provider. It is you who has to write an implementing Provider<LogFileEntry> > class. > You then need to tell Guice to use a certain Provider when asked for a > certain class. > > For instance, you'd implement one Provider for clear text log files: > > public class ClearTextLogFileEntryProvider implements Provider<LogFileEntry> > { > public LogFileEntry get() { > return new ClearTestLogFileEntry(); > } > > } > > or one for encrypted log files: > > public class EncryptedLogFileEntryProvider implements Provider<LogFileEntry> > { > public LogFileEntry get() { > return new EnctryptedLogFileEntry(); > } > > } > > There is no magic here, so you have to tell Guice when to use which > Provider: > > Guice.createInjector(new Module() { > public void configure(Binder binder) { > > binder.bind(LogFileEntry.class).toProvider(ClearTextLogFileProvider.class); > //use clear text logs > } > > }); > > With the above binding, you're telling Guice that the > ClearTextLogFileProvider.class is the source of LogFileEntry's. When the > Injector encounters a class requiring a LogFileEntry or > LogFileEntryProvider, it will use ClearTextLogFileProvider. For instance: > > public class SomethingInteresting { > private Provider<LogFileEntry> provider; > private LogFileEntry log; > > /* > * The ClearTextLogFileProvider.class would be used > * when injecting both of the following dependencies > */ > �...@inject SomethingInteresting( Provider<LogFileEntry> > logFileEntryProvider, LogFileEntry log) { > this.provider = logFileEntryProvider; > this.log = log; > } > > } > > Hope that helps. > > -Brandon > > On Fri, Aug 14, 2009 at 3:47 AM, Anthony MULLER > <[email protected]>wrote: > > > The "Provider<LogFileEntry>" instance is injected in the constructor and > > set as an attribute of the LogFileTransactionLog object. > > > After, that depends on how is implemented the provider itself. When get() > > method is called, the provider implementation can return a new instance > > LogFileEntry, or always the same (quite strange in this case ?) > > > What's your problem about that? > > > Anthony MÜLLER > > > 2009/8/14 zhaoyi <[email protected]> > > >> Can anyone help me on this? thanks. > > >> On Aug 10, 2:38 am, zhaoyi <[email protected]> wrote: > >> > I have read the article "Providers for multiple instances" in this > >> > linkhttp://code.google.com/p/google-guice/wiki/InjectingProviders. > >> > The example shown is: > >> > public class LogFileTransactionLog implements TransactionLog { > > >> > private final Provider<LogFileEntry> logFileProvider; > > >> > @Inject > >> > public LogFileTransactionLog(Provider<LogFileEntry> logFileProvider) > >> > { > >> > this.logFileProvider = logFileProvider; > >> > } > > >> > public void logChargeResult(ChargeResult result) { > >> > LogFileEntry summaryEntry = logFileProvider.get(); > >> > summaryEntry.setText("Charge " + (result.wasSuccessful() ? > >> > "success" : "failure")); > >> > summaryEntry.save(); > > >> > if (!result.wasSuccessful()) { > >> > LogFileEntry detailEntry = logFileProvider.get(); > >> > detailEntry.setText("Failure result: " + result); > >> > detailEntry.save(); > >> > } > >> > } > > >> > There are two places to call logFileProvider.get() method. Are they > >> > return the same type of LogFileEntry? If they return different type of > >> > LogFileEntry, how does logFileProvider know which type is requested? > > >> > thanks. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "google-guice" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/google-guice?hl=en -~----------~----~----~----~------~----~------~--~---
