You need to pass the mixin interfaces to the interceptor, and then check invocation.Method.DeclaringType
On Sun, Jun 28, 2009 at 5:28 PM, Belvasis <[email protected]>wrote: > :-) Ok, than one last simple question...if i can intercept them but can not > call Proceed, how can I decide if those methods should be executed > or not, if thats my intent? > > > 2009/6/28 Ayende Rahien <[email protected]> > >> No, it is false. >> >> >> On Sun, Jun 28, 2009 at 11:23 AM, Belvasis <[email protected]>wrote: >> >>> So in the end, my conclusion from some days ago was not that false: >>> >>> "I thought it would be completely transparent for the user of the object >>> if it i proxied or not. This is true if you work with the public signature >>> of the object, but not if you use reflection as far as i can see." >>> >>> >>> 2009/6/28 Ayende Rahien <[email protected]> >>> >>> Belvasis,DP will direct all calls to the extension interfaces to the >>>> interceptor. You cannot call Proceed on those methods. >>>> You need to recognize and detect them. >>>> >>>> >>>> On Sat, Jun 27, 2009 at 6:15 PM, Belvasis >>>> <[email protected]>wrote: >>>> >>>>> Hm i don't understand this. In the interceptor i don't want to know >>>>> anything about additional interfaces. And as far as i can see, i'm not >>>>> able >>>>> to bring in the target object, if i use CreateClassProxy. If i try to >>>>> Add it as Mixin, an exception it thrown because the >>>>> proxy and the mixing are both implementing the same interface. But >>>>> anyway, i did it now simply with >>>>> >>>>> CreateInterfaceProxyWithTargetInterface(typeof(ITask), >>>>> i_pTask.GetType().GetInterfaces().*Where(x => !(x == >>>>> typeof(ITask))).ToArray()*, i_pTask, >>>>> >>>>> new ProxyGenerationOptions(), new TaskInterceptor()) as ITask; >>>>> >>>>> So the *shouldfind_* test are running with success now, becaus the >>>>> doStart() method has no duplicates. But the problem with the endless >>>>> loop is still there... >>>>> >>>>> >>>>> >>>>> 2009/6/27 Ayende Rahien <[email protected]> >>>>> >>>>>> You need to keep track of the mixin interfaces in the interceptor, you >>>>>> can do that since you create both of them at the same time >>>>>> >>>>>> >>>>>> On Sat, Jun 27, 2009 at 11:36 AM, Belvasis <belvasis.de@ >>>>>> googlemail.com> wrote: >>>>>> >>>>>>> Yes I know, but i have no other possibility in my current case. As i >>>>>>> wrote in another thread, if there where something >>>>>>> like *CreateClassProxyWithTarget* i had no need for this. This means >>>>>>> creating a proxy for an existing object >>>>>>> without the knowledge of specific interfaces: >>>>>>> >>>>>>> Task pTask = TaskRegistry.createTask(pTask); >>>>>>> >>>>>>> ... >>>>>>> clas TaskRegistry >>>>>>> { >>>>>>> Task createTask(Task i_pTask) >>>>>>> { >>>>>>> return CreateClassProxyWithTarget(i_pTask.GetType(),...); >>>>>>> } >>>>>>> } >>>>>>> >>>>>>> So i could intercept all methodes decorated with specific attributes >>>>>>> etc. >>>>>>> >>>>>>> 2009/6/27 Ayende Rahien <[email protected]> >>>>>>> >>>>>>> You are supposed to handle mixin interfaces differently >>>>>>>> >>>>>>>> >>>>>>>> On Fri, Jun 26, 2009 at 12:59 AM, Belvasis <belvasis.de@ >>>>>>>> googlemail.com> wrote: >>>>>>>> >>>>>>>>> So, finally i created some tests. With the *shouldfind_method*test >>>>>>>>> i'm not sure if it is a bug or not. >>>>>>>>> The problem here is that the proxy has two methods with the same >>>>>>>>> name and signature. This is logic since >>>>>>>>> in the tested case one interface is given twice to the >>>>>>>>> ProxyGenerator. I'm just wondering why this doesn't result >>>>>>>>> in an exception. With the real case the problem is, it is not >>>>>>>>> startable with NUnit, Gallio etc. They both crashed. >>>>>>>>> Hope you can find something... >>>>>>>>> >>>>>>>>> >>>>>>>>> 2009/6/25 Belvasis <[email protected]> >>>>>>>>> >>>>>>>>> Yes i'll do it later this evening, i'm on travel right now >>>>>>>>>> >>>>>>>>>> Regards >>>>>>>>>> >>>>>>>>>> Am 25.06.2009 um 16:45 schrieb Ayende Rahien <[email protected]>: >>>>>>>>>> >>>>>>>>>> That most definitely should not.Can you create a test case? >>>>>>>>>> >>>>>>>>>> On Thu, Jun 25, 2009 at 5:41 PM, Belvasis < <http://belvasis.de> >>>>>>>>>> belvasis.de@ <http://googlemail.com>googlemail.com> wrote: >>>>>>>>>> >>>>>>>>>>> Now i'm confused ;) Did you think i called the MethodInfo.Invoke >>>>>>>>>>> from inside the intercepto? No, no i didn't. That this results in >>>>>>>>>>> an endless >>>>>>>>>>> loop is clear. I did simply: >>>>>>>>>>> Obj = CreateInterfacProxyWithTarget >>>>>>>>>>> pMethod.Invoke(obj...) >>>>>>>>>>> >>>>>>>>>>> And Inside the interceptor: >>>>>>>>>>> >>>>>>>>>>> ... >>>>>>>>>>> If( check(...)) >>>>>>>>>>> invocation.proceed() >>>>>>>>>>> >>>>>>>>>>> This leads to a StackOverflow... >>>>>>>>>>> >>>>>>>>>>> Am 25.06.2009 um 16:09 schrieb Ayende Rahien <<[email protected]> >>>>>>>>>>> [email protected]>: >>>>>>>>>>> >>>>>>>>>>> It _is_, from the OUTSIDE.You are calling this from the >>>>>>>>>>> intereceptor! >>>>>>>>>>> >>>>>>>>>>> On Thu, Jun 25, 2009 at 5:03 PM, Belvasis < >>>>>>>>>>> <http://belvasis.de><http://belvasis.de> >>>>>>>>>>> belvasis.de@ <http://googlemail.com> <http://googlemail.com> >>>>>>>>>>> googlemail.com> wrote: >>>>>>>>>>> >>>>>>>>>>>> No thats not what i want or need :( I thought it would be >>>>>>>>>>>> completely transparent for the user of the object if it i proxied >>>>>>>>>>>> or not. >>>>>>>>>>>> This is true if you work with the public signature of the object, >>>>>>>>>>>> but not if >>>>>>>>>>>> you use reflection as far as i can see. I wanted the developer to >>>>>>>>>>>> call >>>>>>>>>>>> something like TaskRegistry.invokeTask("taskDef"). In the end this >>>>>>>>>>>> builds a >>>>>>>>>>>> stateless Task object. Every method of the Task can be decorated >>>>>>>>>>>> with an >>>>>>>>>>>> TaskImplementor("taskDef") Attribute and those methods should be >>>>>>>>>>>> intercepted >>>>>>>>>>>> to check availability, permission etc., if the are invoked. So i >>>>>>>>>>>> have to use >>>>>>>>>>>> reflection for it. Maybe i have to think about other ways to do >>>>>>>>>>>> this. >>>>>>>>>>>> >>>>>>>>>>>> Regards >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Am 25.06.2009 um 10:01 schrieb Ayende Rahien >>>>>>>>>>>> <<[email protected]><[email protected]> >>>>>>>>>>>> [email protected]>: >>>>>>>>>>>> >>>>>>>>>>>> Yes, that is what you want, no? >>>>>>>>>>>> >>>>>>>>>>>> On Thu, Jun 25, 2009 at 10:50 AM, Belvasis >>>>>>>>>>>> <<http://belvasis.de><http://belvasis.de><http://belvasis.de> >>>>>>>>>>>> belvasis.de@ <http://googlemail.com> >>>>>>>>>>>> <http://googlemail.com><http://googlemail.com> >>>>>>>>>>>> googlemail.com> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> But if i invoke the method on the DynProxyGetTarget() - object >>>>>>>>>>>>> it bypasses the interceptor, or do Ido something wrong? On the >>>>>>>>>>>>> other hand >>>>>>>>>>>>> what you say means, you have alwys to know if an object is a >>>>>>>>>>>>> proxy or not. Is this wanted? >>>>>>>>>>>>> >>>>>>>>>>>>> Thanks and regards >>>>>>>>>>>>> >>>>>>>>>>>>> Am 25.06.2009 um 02:01 schrieb Ayende Rahien >>>>>>>>>>>>> <<[email protected]><[email protected]><[email protected]> >>>>>>>>>>>>> [email protected]>: >>>>>>>>>>>>> >>>>>>>>>>>>> That is the expected behavior.Invoking a method using Invoke >>>>>>>>>>>>> will mean that you get back to the interceptor. >>>>>>>>>>>>> The workaround you specified is how this should work. >>>>>>>>>>>>> >>>>>>>>>>>>> On Thu, Jun 25, 2009 at 2:55 AM, Belvasis >>>>>>>>>>>>> <<http://belvasis.de><http://belvasis.de><http://belvasis.de><http://belvasis.de> >>>>>>>>>>>>> belvasis.de@ <http://googlemail.com> >>>>>>>>>>>>> <http://googlemail.com><http://googlemail.com><http://googlemail.com> >>>>>>>>>>>>> googlemail.com> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> > >>>>>>>>>>>>>> >>>>>>>>>>>>>> > Hi, >>>>>>>>>>>>>> > I have the following problem: >>>>>>>>>>>>>> > I want to invoke a method on a proxy >>>>>>>>>>>>>> > using MethodInfo.Invoke(...). The method should be >>>>>>>>>>>>>> intercepted, if the >>>>>>>>>>>>>> > InterceptorSelector decided to do so. >>>>>>>>>>>>>> > The problem is, that the Interceptor.Intercept method is >>>>>>>>>>>>>> called in >>>>>>>>>>>>>> > an endless loop, if invocation.Proceed is called Inside the >>>>>>>>>>>>>> > interceptor. Anyone an idea why this happend? If i invoke >>>>>>>>>>>>>> the >>>>>>>>>>>>>> > corresponding MethodInfo of the DynProxyGetTarget() - >>>>>>>>>>>>>> object, it >>>>>>>>>>>>>> > works as expected. >>>>>>>>>>>>>> > >>>>>>>>>>>>>> > Thanks >>>>>>>>>>>>>> > Belvasis >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> >>>>> >>>>> >>>>> >>>> >>>> >>>> >>> >>> >>> >> >> >> > > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
