Hi Ayende,
since you are a little sparing of words, it is sometimes not so easy to see
what your indications mean :-)
But after all i think, i understand now, how it works:

MethodInfo pMethod = pProxy.GetType().GetMethod("doStartExt");
pMethod.Invoke(pProxy, new object[] {});
=> this will call the interceptor

=> in the interceptor one has to check, if the method is from the TargetType
or from an mixin interface

     if( invocation.TargetType != invocation.Method.DeclaringType )
=> if this is true, then Invoke the method"again" on the
(invocation.InvocationTarget as IProxyTargetAccessor).DynProxyGetTarget()

So, this works. But after all, you have to admit, that this is hard to find
out without any hint or help, isn't it? I think, the signature of the
method is a little misleading: CreateInterfaceProxyWithTargetInterface(Type
*interfaceToProxy*, Type[] *additionalInterfacesToProxy*,...)
In my reading this means the additionalInterfacesToProxy are handled in the
same way as the interfaceToProxy.

But anyway, thanks for the hints and for having patience with me :-)

Regards

2009/6/28 Ayende Rahien <[email protected]>

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

Reply via email to