This happens because the proxy inherits the type and you loose all
attributes.
Refer to the original class and get the method by methodInfo.name

2010/8/12 PB <[email protected]>

> thanks.  you have been a great help. hv another question. as I did not
> want every member of the class to be intercepted, i created following
> hook that inspects the attribute on the members. now issue is
> attributes on methods are identified, but not on the property.
>
> public class AutoNotifyPropertyChangedProxyGenerationHook :
> IProxyGenerationHook
> {
>    public void MethodsInspected() {}
>    public void NonProxyableMemberNotification(Type type, MemberInfo
> memberInfo) {}
>
>    public bool ShouldInterceptMethod(Type type, MethodInfo
> methodInfo)
>    {
>         return GetAttribute(methodInfo) != null;
>    }
>
>    private static NotifyChangeAttribute GetAttribute(MethodInfo
> methodInfo)
>    {
>        object[] logAttribute =
> methodInfo.GetCustomAttributes(typeof(NotifyChangeAttribute), true);
>         if (logAttribute.Length == 0)
>        {
>            return null;
>        }
>        else
>        {
>             return (NotifyChangeAttribute)logAttribute[0];
>        }
>    }
> }
>
> public interface IViewModel
> {
>    [NotifyChange] // this is not identified in the hook.
>    string Name { get; set; }
>
>    [NotifyChange] // this is not identified in the hook.
>    string Age { get; set; }
>
>    [NotifyChange] // this does get indentified
>    void SomeMethod();
> }
>
> Could you please help. thanks
>
>
> On Aug 11, 9:15 am, Krzysztof Koźmic <[email protected]>
> wrote:
> >  http://stw.castleproject.org/Windsor.Installers.ashx
> >
> > helper method as in a private method  that you'll wrap your repetitive
> > code with.
> >
> > Krzysztof
> >
> > On 11/08/2010 9:08 AM,PBwrote:
> >
> >
> >
> > > could you please provide some reference on writing a helper method in
> > > the installer? by installer do you mean application package? thanks
> >
> > > On Aug 10, 3:15 pm, Krzysztof Koźmic<[email protected]>
> > > wrote:
> > >>    Yes and no.
> >
> > >> Yes there's no OOTB dedicated hook in the container for this.
> > >> No, you don't have to specify that manually for each and every
> > >> component. Like I said before you can write a helper method in your
> > >> installer that will do it, or build a ComponentModel construction
> > >> contributor, although I'd rather suggest going with helper method.
> >
> > >> Krzysztof
> >
> > >> On 10/08/2010 3:10 PM,PBwrote:
> >
> > >>> So you mean if I have 50 classes that I want to provide same logger,
> > >>> I’ll have to explicitly register the same interceptor and hook for
> > >>> every class
> > >>> container.Register(Component.For<LogInterceptor>(),
> > >>> Component.For<LoggingProxyGenerationHook>(),
> > >>> Component.For<ILogger>().ImplementedBy<Logger>(),
> > >>>
> Component.For<IFoo>().ImplementedBy<Foo>().Interceptors<LogInterceptor>().P­­¬roxy.Hook(
> > >>> h =>    h.Service<LoggingProxyGenerationHook>()),
> > >>>
> Component.For<IMath>().ImplementedBy<Math>().Interceptors<LogInterceptor>()­­.
> > >>> Proxy.Hook(h =>    h.Service<LoggingProxyGenerationHook>()),
> > >>>
> Component.For<ICar>().ImplementedBy<Car>().Interceptors<LogInterceptor>().
> > >>> Proxy.Hook(h =>    h.Service<LoggingProxyGenerationHook>())
> > >>> );
> > >>> Can’t we configure the container to use the interceptor for all the
> > >>> classes that get resolved by the container? Wouldn’t it be easier and
> > >>> cleaner that way, you don’t have to be repetitive.
> > >>> I can’t remember exactly, but there was mention of sometime similar
> by
> > >>> creating a facility and registering it, something along those lines?
> > >>> Regards
> > >>> On Aug 10, 7:50 am, Krzysztof Koźmic<[email protected]>
> > >>> wrote:
> > >>>>     No you cant - adding interceptor is a fine grained task and you
> seldom
> > >>>> want to apply them globally.
> > >>>> If you do though - nothis is stopping you from adding a helper
> method in
> > >>>> your installer and registering through it.
> > >>>> HTH
> > >>>> Krzysztof
> > >>>> On 9/08/2010 11:36 PM,PBwrote:
> > >>>>> Finally got it working, have couple of questions though.
> > >>>>> This is what I did:
> > >>>>> public class LoggingProxyGenerationHook : IProxyGenerationHook
> > >>>>> {
> > >>>>>        public bool ShouldInterceptMethod(Type type, MethodInfo
> > >>>>> methodInfo)
> > >>>>>        {
> > >>>>>            return GetLogAttribute(methodInfo) != null;
> > >>>>>        }
> > >>>>>        private static LogAttribute
> > >>>>> GetLogAttribute(ICustomAttributeProvider methodInfo)
> > >>>>>        {
> > >>>>>            object[] logAttribute =
> methodInfo.GetCustomAttributes(typeof
> > >>>>> (LogAttribute), true);
> > >>>>>            if (logAttribute.Length == 0)
> > >>>>>            {
> > >>>>>                return null;
> > >>>>>            }
> > >>>>>            else
> > >>>>>            {
> > >>>>>                return (LogAttribute) logAttribute[0];
> > >>>>>            }
> > >>>>>        }
> > >>>>> }
> > >>>>> container.Register(Component.For<LogInterceptor>(),
> > >>>>>                        Component.For<LoggingProxyGenerationHook>(),
> > >>>>>
>  Component.For<ILogger>().ImplementedBy<Logger>(),
> > >>>>>
> Component.For<IFoo>().ImplementedBy<Foo>().Interceptors<LogInterceptor>().P­­­roxy.Hook(
> > >>>>>                            h =>
> > >>>>> h.Service<LoggingProxyGenerationHook>()));
> > >>>>> The above code registers LogInterceptor for implementation of IFoo.
> > >>>>> What if I want to use the interceptor with every interface
> > >>>>> implementation that is instantiated through the container. Is there
> a
> > >>>>> global level where we can register the interceptor and the proxy
> hook,
> > >>>>> in order to avoid the repetitive task of registeration for each
> > >>>>> interface.
> > >>>>> Thanks
> > >>>>> On Jul 23, 1:25 pm, Krzysztof Koźmic<[email protected]>
> > >>>>> wrote:
> > >>>>>> Looks like it's missing from v2.1
> > >>>>>> You'd have to write custom descriptor and call AddDescriptor(new
> > >>>>>> MyDescriptor(new SomeHook()));
> > >>>>>> In the descriptor you override the ApplyToModel method like this:
> > >>>>>>         ProxyUtil.ObtainProxyOptions(model, true).Hook= this.hook;
> > >>>>>> or you can upgrade to v2.5 which has that.
> > >>>>>> HTH,
> > >>>>>> Krzysztof
> > >>>>>> On 23/07/2010 1:08 PM,PBwrote:
> > >>>>>>> do you know what that way would be?
> > >>>>>>> On Jul 20, 12:54 pm, Krzysztof Koźmic<[email protected]
> >
> > >>>>>>> wrote:
> > >>>>>>>> Correct, that was added recently. I think there was some way of
> > >>>>>>>> specifying hook in v2.1.1 though
> > >>>>>>>> On 20/07/2010 12:52 PM,PBwrote:
> > >>>>>>>>> Hi
> > >>>>>>>>> Thanks for reply. I am using v2.1.1 and there is no
> implementation of
> > >>>>>>>>> Hook
> > >>>>>>>>> Proxy.Hook(h  =>           h.Service<ProxyNothingHook>()
> > >>>>>>>>> Regards
> > >>>>>>>>> On Jul 13, 9:58 pm, Krzysztof Koźmic<
> [email protected]>
> > >>>>>>>>> wrote:
> > >>>>>>>>>> You don't register PGO, but you can configure all relevant
> aspects of
> > >>>>>>>>>> the proxy mechanism.
> > >>>>>>>>>> In trunk version of Windsor you can do:
> > >>>>>>>>>> var  interceptor  =  new  ResultModifierInterceptor(5);
> > >>>>>>>>>>
> container.Register(Component.For<ResultModifierInterceptor>().Instance(inte­­­­­­rceptor),
> > >>>>>>>>>>
>  Component.For<ProxyNothingHook>(),
> > >>>>>>>>>>                              Component.For<ICalcService>()
> > >>>>>>>>>>
>  .ImplementedBy<CalculatorService>()
> > >>>>>>>>>>
>  .Interceptors<ResultModifierInterceptor>()
> > >>>>>>>>>>                              .Proxy.Hook(h  =>
>  h.Service<ProxyNothingHook>()));
> > >>>>>>>>>> var  calc  =  container.Resolve<ICalcService>();
> > >>>>>>>>>> Assert.AreEqual(4,calc.Sum(2,2));
> > >>>>>>>>>> In version v2.1.1 something similar although you can provide
> hook only
> > >>>>>>>>>> as an instance IIRC.
> > >>>>>>>>>> Version 2.5 beta1 does not have it which is my omission. Beta2
> and final
> > >>>>>>>>>> version will work like the sample above
> > >>>>>>>>>> Krzysztof
> > >>>>>>>>>> On 13/07/2010 9:53 PM,PBwrote:
> > >>>>>>>>>>> I came across this article of your on Selecting which methods
> to
> > >>>>>>>>>>> intercept which shows an implementation of
> ProxyGenerationOptions with
> > >>>>>>>>>>> ProxyGenerationHook. I am using windsor container and
> register types
> > >>>>>>>>>>> as follow
> > >>>>>>>>>>> IWindsorContainer container = new WindsorContainer();
> > >>>>>>>>>>>        container.Register(
> > >>>>>>>>>>>
> Component.For<IFoo>().ImplementedBy<Foo>(),
> > >>>>>>>>>>>
> Component.For<ILogger>().ImplementedBy<Logger>(),
> > >>>>>>>>>>>
> Component.For<LogInterceptor>().LifeStyle.Transient);
> > >>>>>>>>>>> could you please indicate how can i register
> ProxyGenerationOptions
> > >>>>>>>>>>> using windsor container. Thanks
> > >>>>>>>>>>>
> http://kozmic.pl/archive/2009/01/17/castle-dynamic-proxy-tutorial-par...
> > >>>>>>>>>>> On Jul 10, 11:15 pm, Krzysztof Koźmic<
> [email protected]>
> > >>>>>>>>>>> wrote:
> > >>>>>>>>>>>> using either IProxyGenerationHook, or IIntreceptorSelector
> > >>>>>>>>>>>>
> Component.For<IFoo>().ImplementedBy<Foo>().Interceptors<SomeInterceptor,
> > >>>>>>>>>>>> SomeOtherInterceptor>()
> > >>>>>>>>>>>> 2010/7/10PB<[email protected]>:
> > >>>>>>>>>>>>> thanks. then how can i prevent a method from being
> intercepted for
> > >>>>>>>>>>>>> interfaces?
> > >>>>>>>>>>>>> regards.
> > >>>>>>>>>>>>> On Jul 9, 8:05 pm, Krzysztof Koźmic<
> [email protected]>
> > >>>>>>>>>>>>> wrote:
> > >>>>>>>>>>>>>> You're mixing stuff up here. Attributes and being virtual
> are unrelated.
> > >>>>>>>>>>>>>> Class components need to have methods virtual to be
> interceptable.
> > >>>>>>>>>>>>>> Interfaces are virtual by definition.
> > >>>>>>>>>>>>>> You don't need attributes at all - just assign interceptor
> to the
> > >>>>>>>>>>>>>> component when registering it.
> > >>>>>>>>>>>>>> Krzysztof
> > >>>>>>>>>>>>>> On 9/07/2010 12:30 PM,PBwrote:
> > >>>>>>>>>>>>>>> I use Windsor container for DI in my application. I want
> to implement
> > >>>>>>>>>>>>>>> interception and confused wether I'll have to change the
> existing
> > >>>>>>>>>>>>>>> implementation to use Dynamic Proxy to create objects so
> that they can
> > >>>>>>>>>>>>>>> be intercepted or is there a way to integrate with
> existing Windsor
> > >>>>>>>>>>>>>>> container.
> > >>>>>>>>>>>>>>> Also how can I implement attribute based method
> interception? I don't
> > >>>>>>>>>>>>>>> want classes to be attributed with
> > >>>>>>>>>>>>>>> [Interceptor(typeof(LogInterceptor))] and then create
> virtual methods.
> > >>>>>>>>>>>>>>> Ninject allows you to derive your attribute class from
> > >>>>>>>>>>>>>>> InterceptAttribute class and decorate methods for
> interception.
> > >>>>>>>>>>>>>>>
> [AttributeUsage(AttributeTargets.Property|AttributeTargets.Method,
> > >>>>>>>>>>>>>>> AllowMultiple = false, Inherited = true)]
> > >>>>>>>>>>>>>>>            public class LogAttribute : InterceptAttribute
> > >>>>>>>>>>>>>>>            {
> > >>>>>>>>>>>>>>>                public override IInterceptor
> CreateInterceptor(IProxyRequest
> > >>>>>>>>>>>>>>> request)
> > >>>>>>>>>>>>>>>                {
> > >>>>>>>>>>>>>>>                    return
> request.Context.Kernel.Get<LogInterceptor>();
> > >>>>>>>>>>>>>>>                }
> > >>>>>>>>>>>>>>>            }
> > >>>>>>>>>>>>>>> Is it achievable with castle?
> > >>>>>>>>>>>>>>> Thanks- Hide quoted text -
> > >>>>>>>>>>>>>> - Show quoted text -
> > >>>>>>>>>>>>> --
> > >>>>>>>>>>>>> You received this message because you are subscribed to the
> Google Groups "Castle Project Users" group.
> > >>>>>>>>>>>>> To post to this group, send email to
> [email protected].
> > >>>>>>>>>>>>> To unsubscribe from this group, send email to
> [email protected]<castle-project-users%[email protected]>
> .
> > >>>>>>>>>>>>> For more options, visit this group athttp://
> groups.google.com/group/castle-project-users?hl=en.-Hidequoted...
> > >>>>>>>>>>>> - Show quoted text -- Hide quoted text -
> > >>>>>>>>>> - Show quoted text -- Hide quoted text -
> >
> > ...
> >
> > read more »- Hide quoted text -
> >
> > - Show quoted text -
>
> --
> You received this message because you are subscribed to the Google Groups
> "Castle Project Users" group.
> To post to this group, send email to [email protected]
> .
> To unsubscribe from this group, send email to
> [email protected]<castle-project-users%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/castle-project-users?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Castle Project Users" 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/castle-project-users?hl=en.

Reply via email to