|
From: Deyan P. <de...@ho...> - 2004-10-23 12:31:09
|
Hi hammett,
Why don't you simply generate something like the stuff below? I think that
if you don't use runtime reflection the execution will be measurable with
the unproxied execution, otherwise it's much slower ...:
class MyClassProxy : MyClass
{
...
private IInvocationHandler _handler;
public override object DoSomething(int x)
{
object result = null;
if(!_handler.PreProcess(base, ref result)) return result;
result = base.DoSomething(x);
_handler.PostProcess(base, ref result);
return result;
}
public override void DoSomethingElse(int x)
{
if(!_handler.PreProcess(base)) return;
base.DoSomethingElse(x);
_handler.PostProcess(base);
return;
}
}
Br,
Deyan Petrov
----- Original Message -----
From: "hammett" <ha...@uo...>
To: <asp...@li...>
Sent: Saturday, October 23, 2004 9:59 AM
Subject: [Aspectsharp-users] Proposal: Big Change
> Guys,
>
> I've stopped for a while to analyze our strategy on proxying concrete
> classes. Just to set a common ground:
>
> MyClass x = new MyClass()
>
> ProxyGenerator generator = new ProxyGenerator();
> StandardInvocationHandler handler = new
> StandardInvocationHandler(myClass);
> MyClass proxy = (MyClass)
> generator.CreateClassProxy( typeof(MyClass), handler );
>
>
> -=- How it works? -=-
>
> The generator creates a dynamic type which extends MyClass and override
all
> methods creating stubs. These stubs code are something like:
>
> public override void DoSomething( int val )
> {
> MethodInfo m = MethodBase.GetMethodFromHandle( ldtoken method );
> handler.Invoke( this, m, val );
> }
>
> So every invocation has to delegate the to a "real" class instance. In the
> code above, the x will be the real instance. Thus we have two copies of
the
> same class. Do we really need them?
> The DynamicProxy originally intented to proxy interfaces, and someway it
> grow offering proxy capabilities to concrete classes, but now I realize
that
> the interface should be different.
>
>
> -=- Proposal -=-
>
> interface IClassInterceptor // better name?
> {
> object Intercept( IInvocation invocation );
> }
>
> interface IInvocation
> {
> object[] Arguments { get; set; }
>
> object Proxy { get; set; }
>
> object Proceed();
> }
>
>
> Now the user, instead of using a IInvocationHandler, should use
>
> ProxyGenerator generator = new ProxyGenerator();
> DefaultClassInterceptor interceptor = new DefaultClassInterceptor();
>
> MyClass proxy = (MyClass) generator.CreateClassProxy( typeof(MyClass),
> handler );
>
> Now we dont have separate instances. When a method is invoked on the
proxy,
> the Intercept is invoked. If the user invoke the Invocation.Proceed, the
> proxy calls the super class to invoke the real implementation. How do you
> like that?
>
>
> -=- Under the hood -=-
>
> I've played for five minutes, so I'm not sure if this is the best
approach,
> with the best performance, but it relies on delegates.
>
> class MyClassProxy : MyClass
> {
> ...
>
> delegate void __MyClass_DoSomething(int x);
>
> public override void DoSomething(int x)
> {
> MethodInfo m = MethodBase.GetMethodFromHandle( ldtoken method );
> InvocationImpl invocation = new InvocationImpl( this, m, new
> __MyClass_DoSomething(callback__DoSomething), x );
> interceptor.Intercept( invocation );
> }
>
> private void callback__DoSomething(int x)
> {
> base.DoSomething(x);
> }
> }
>
> class InvocationImpl : IInvocation
> {
> public InvocationImpl( object proxy, MethodInfo m, delegate call, params
> object[] args )
> {
> ..
> }
>
> public object Proceed()
> {
> call.DynamicInvoke( args );
> }
> }
>
>
> Yes, it works!
> But before I start to code this beast we need to agree on these
interfaces.
> Also, can we think of something similar to interface proxies?
> We're close to the first non-beta release and once this is release, change
> interfaces will hurt users, and we don't want that.
>
>
> --
> Cheers,
> hammett
> http://www.digitalcraftsmen.com.br/~hammett
>
>
>
>
>
> -------------------------------------------------------
> This SF.net email is sponsored by: IT Product Guide on ITManagersJournal
> Use IT products in your business? Tell us what you think of them. Give us
> Your Opinions, Get Free ThinkGeek Gift Certificates! Click to find out
more
> http://productguide.itmanagersjournal.com/guidepromo.tmpl
> _______________________________________________
> Aspectsharp-users mailing list
> Asp...@li...
> https://lists.sourceforge.net/lists/listinfo/aspectsharp-users
>
|