1

在下面的示例中,如何避免在调用前后出现一对重复的行? 详细信息:这是真正更大代码的可编译模拟。通常它是一层代理类,包含具有各种 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)
    {

    }
}
}
4

1 回答 1

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));
    }
}
于 2012-06-29T02:22:20.350 回答