Rodrigo,
Cute example but the fact that LoggerFor<T> takes in the name of the
enclosing class defeats the entire purpose.
I like the "InjectionContext" proposal quite a bit. Any chance that
being added?
Gili
Rodrigo Couto wrote:
> One could take this problem to another direction. The problem, it
> seems, is the fact that you must pass a parameter to the Logger about
> the class (or type) of the injectee. There is a way to accomplish
> this, but it won't be pretty :)
>
> public class LoggerFor<T> {
> @Inject private TypeLiteral<T> injectee;
> public Logger passMeTheLogger() { return Logger.getLogger
> (injectee.getRawType()); }
> }
>
> Then, suppose you want to use a logger in the following class:
>
> public class LoggerUser {
> @Inject private LoggerFor<LoggerUser> please;
> public void doesSomething() {
> Logger logger = please.passMeTheLogger();
> logger.debug("thanks!");
> }
> }
>
> There is the obvious drawback: now you have to bind a LoggerFor<T> for
> every of its clients.
>
> -- Rodrigo Couto
>
> On 25 jul, 14:17, Adrian Cole <[email protected]> wrote:
>> Indeed you are correct. I believe this is the only way to accomplish
>> the goal with the current version of guice without hacking core
>> classes. I don't think this was possible at all in Guice 1.0.
>>
>> For this to be accomplished natively, one way could be to add a
>> context to providers. In this context, one could reach the injectee
>> like below:
>>
>> @Provider Logger providerLogger(InjectionContext context){
>> return Logger.getLogger(context.getInjectee().getClass().getName());
>>
>> }
>>
>> I'm interested in other opinions on how to accomplish this.
>>
>> Regards,
>> -Adrian
>> jclouds
>>
>> On Sat, Jul 25, 2009 at 4:51 PM, Gili Tzabari<[email protected]> wrote:
>>
>>> Hi Adrian,
>>> If I understand your code directly, you always inject
>>> Logger.getRootLogger() into the constructor, then use reflection to
>>> alter the field after-the-fact to the current type. Is this correct?
>>> I'm looking for a way to set the Constructor argument to the right
>>> value in the first place, instead of fixing it after the fact. It seems
>>> to me that Guice 2.0 is missing a facility for this sort of thing. Are
>>> there any plans for adding one in Guice 2.1 or 3.0?
>>> Thanks,
>>> Gili
>>> Adrian Cole wrote:
>>>> Hi, Gili.
>>>> I've just coded this for you.. I hope you digg it ;)
>>>> http://digg.com/d3yXEh
>>>> Cheers,
>>>> -Adrian
>>>> jclouds
>>>> On Fri, Jul 24, 2009 at 2:22 PM, Gili Tzabari<[email protected]>
>>>> wrote:
>>>>> Guys,
>>>>> I don't understand your answers. It sounds to me like you're
>>>>> talking
>>>>> about field injection, not constructor injection.
>>>>> I don't want to inject a log into an already-constructed object. I
>>>>> want
>>>>> to inject a log directly into the class constructor:
>>>>> class Foo
>>>>> {
>>>>> private final Logger log;
>>>>> @Inject
>>>>> public Foo(Logger log)
>>>>> {
>>>>> this.log = log;
>>>>> }
>>>>> }
>>>>> Also, I am not necessarily doing this for jdk loggers so please
>>>>> provide
>>>>> more detail on how to write a custom injection listener to do this.
>>>>> Thanks,
>>>>> Gili
>>>>> Adrian Cole wrote:
>>>>>> If just injecting a log class, you're right: that's trivial. The
>>>>>> less trivial part is setting the log scope relevant to the object
>>>>>> being constructed.
>>>>>> -Adrian
>>>>>> On Fri, Jul 24, 2009 at 10:51 AM, Dhanji R. Prasanna<[email protected]>
>>>>>> wrote:
>>>>>>> You can also write a trivial injection listener that looks for whatever
>>>>>>> logging class you like and set it after construction.
>>>>>>> Dhanji.
>>>>>>> On Fri, Jul 24, 2009 at 5:49 PM, Adrian Cole <[email protected]> wrote:
>>>>>>>> In jclouds, we use a similar approach, but don't bind ourselves to
>>>>>>>> java or log4j:
>>>>>>>> http://code.google.com/p/jclouds/wiki/LogDesign
>>>>>>>> Here's the configuration class that may help you do what you are
>>>>>>>> looking
>>>>>>>> for:
>>>>>>>> http://code.google.com/p/jclouds/source/browse/trunk/core/src/main/ja...
>>>>>>>> I hope this helps,
>>>>>>>> -Adrian
>>>>>>>> jclouds
>>>>>>>> On Fri, Jul 24, 2009 at 6:15 AM, Dhanji R. Prasanna<[email protected]>
>>>>>>>> wrote:
>>>>>>>>> You can already do this with jdk loggers.
>>>>>>>>> Dhanji.
>>>>>>>>> On Fri, Jul 24, 2009 at 2:12 PM, Gili <[email protected]> wrote:
>>>>>>>>>> Hi,
>>>>>>>>>> Is it possible to implement Log4JMembersInjector -- as found here:
>>>>>>>>>> http://code.google.com/p/google-guice/wiki/CustomInjections-- but for
>>>>>>>>>> constructor injection instead? That is, I'd like Guice to be smart
>>>>>>>>>> enough to inject the correct Logger instance into the constructor
>>>>>>>>>> automatically. I took a look at InjectionListener but it seems to
>>>>>>>>>> hook
>>>>>>>>>> instances that have already been injected. Another approach that
>>>>>>>>>> comes
>>>>>>>>>> to mind is:
>>>>>>>>>> @Provides
>>>>>>>>>> public Logger getLogger(Class<?> outerClass);
>>>>>>>>>> If I could somehow get Guice to pass in the correct Class... Any
>>>>>>>>>> ideas?
>>>>>>>>>> Gili
> >
>
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---