通过一种方法调用可变数量的方法

时间:2011-09-03 03:03:15

标签: c# wcf

我有一个存储和处理图像的WCF服务。使用应用程序可以通过调用Bitmap Download(int fileid)来下载图像,也可以通过调用Bitmap Crop(Bitmap image, x1, x2, y1, y2)Bitmap Resize(Bitmap image, int height)Bitmap Rotate(Bitmap image, float angle)等其他方法来修改它们。

这里的问题是,当客户想要调用上面三种图像处理方法中的任何一种(裁剪,调整大小,旋转)时,他们必须首先下载它,然后连续调用操作方法,每次将图像发送回WCF服务,然后获取新的System.Drawing.Bitmap对象作为返回参数。

问题是,如何避免来回发送图像?有没有办法可以通过一种方法调用可变数量的方法?如果我还不够清楚,那么这就是我想做的事情(我知道这不是有效的代码):

Bitmap bmp = Download(2, Resize(500, 200), Rotate(90.00));

4 个答案:

答案 0 :(得分:3)

我过去设计了一个类似的API,它接受了一个“动作”列表作为它的参数。类似的东西:

List<Action> actions = new List<Action>();

a1 = new Action();
a1.action = Action.ActionType.Resize;
a1.params.add(500);
a1.params.add;
actions.add(a1);

a2 = new Action();
a2.action = Action.ActionTypes.Rotate;
a2.params.add(90);
actions.add(a2);

Bitmap bmp = Download(actions);

答案 1 :(得分:2)

我可能会这样做:

public Bitmap Download(int image, Dictionary<string, string[]> operations)
{
    // fetch image here

    ForEach(KeyValuePair<string, string[]> kvp in operations)
    {
        switch(kvp.Key)
        {
            case "Crop":
                ...etc...etc
        }
    }
}

字典键可以是方法名称,值可以是传递给方法所需的任何参数。

答案 2 :(得分:0)

说实话,这对于WCF服务来说有点奇怪。那里的大多数客户都足够聪明,可以自己操作图像,而且不需要服务器就可以完成。

您可以让客户端将映像上载到服务器并让WCF服务返回唯一ID。然后,所有后续调用都将发送唯一ID而不是完整位图,告诉服务器对刚刚上传的图像执行操作。操作完图像后,再次调用下载,客户端将重新下载修改后的图像。

如果您想要防止这些图像长期存储在服务器上,您的服务器需要暂时缓存这些图像并最终在一定时间后删除它们。

答案 3 :(得分:0)

这是另一种解决方法。该方法可以接受一个对象数组,每个对象都包含特定于它所代表的图像操作类型的DataMembers。

public void Download(int fileid, params object[] operations);

在客户端,我们这样调用它......

Bitmap edit = Download(1, new CropOperation(1, 2, 3, 4), new RotateOperation(57));

CropOperationRotateOperation都是简单的DataContract类。

在服务器端,我们对GetType()中的每个对象执行object[] operations,之后我们就可以访问对象的成员并调用相应的方法。