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
-~----------~----~----~----~------~----~------~--~---

Reply via email to