包含不同签名的方法,前后调用

时间:2012-06-29 00:51:55

标签: c# wpf c#-4.0 aop

如何在下面的示例中调用之前和之后避免一对重复的行? 详细信息:这是可编译的模拟实际更大的代码。通常,它是一个代理类层,包含具有各种API的服务客户端。重复部分是每个客户的每个方法的前后调用。遗憾的是,所有可能的方法都没有单一的签名,前后部分需要指向客户端通道和上下文的指针。 是否可以应用像AOP,泛型,代表,属性等先进的东西?谢谢

using System;

namespace ConsoleApplication
{
class ClassServiceClient: IDisposable
{ 
    public Object channel()
    {
        return "something";
    }

    public Object context()
    {
        return "something other";
    }
}

class ClassA : ClassServiceClient
{
    public Object methodA()
    {
        return "something other";
    }
}

class ClassB : ClassServiceClient
{
    public void methodB(string param)
    {
        return;
    }
}

class ClassAProxy 
{
    public Object methodA()
    {
        using (ClassA client = new ClassA())         
        {
            Program.preparation(client.channel());   //<---- repetitive part
            Object result = client.methodA();
            Program.postinvocation(client.context());//<---- repetitive part
            return result;
        }
    }
}

class ClassBProxy
{
    public void methodB(string param)
    {
        using (ClassB client = new ClassB())
        {
            Program.preparation(client.channel());   //<---- repetitive part
            client.methodB(param);
            Program.postinvocation(client.context());//<---- repetitive part
            return;
        }
    }
}


class Program
{
    public static void preparation(Object channel)
    {
        // Do something with channel
    }

    public static void postinvocation(Object context)
    {
        // Do something with context
    }

    static void Main(string[] args)
    {

    }
}
}

1 个答案:

答案 0 :(得分:1)

如果可以使用公共基类,则可以轻松使用执行调用的公共密封方法和执行逻辑的受保护抽象方法,例如

class ProxyBase{
    public void Method(params object[] args){
        PreConditions();
        Invoke(args);               
        PostConditions();
    }

    protected abstract void Invoke(object[] args);
}

class ClassAProxy{
    protected override void Invoke(object[] args){
        client.Method(args[0]);
    }
}

通过在Program类中声明一个采取操作的InvocationHandler,您可以在功能上实现类似的结果:

class Program{
    public static void Invoke(object[] args, Action action){
        PreConditions();
        action();
        PostConditions();
    }
}

class ClassAProxy{
    public void MethodA(int i){
        Program.Invoke(() => client.Something(i));
    }
}