WCF代理 - 创建一个通用的调用方法来执行对服务的每次访问

时间:2015-12-22 12:27:10

标签: c# wcf proxy action

我正在使用WCF并且我在客户端中创建了自己的代理,我想创建一个使用lambda表达式或Action的方法来执行所有操作。

这是我的代理人:

public class BooksProxy
{
    public ChannelFactory<IBooksService> Channel { get; set; }

    public BooksProxy()
    {
        Channel = new ChannelFactory<IBooksService>("endpoint");
    }

    public IBooksService CreateChannel()
    {
        return Channel.CreateChannel();
    }
}

以下是我如何使用代理:

IBooksService proxy = BooksProxy.CreateChannel();
IList<string> lst = proxy.GetStrings();
((ICommunicationObject)proxy).Close();

我想在BooksProxy类中执行类似的操作:

public void Execute(Action<...> action)
{
    IBooksService proxy = this.CreateChannel();

    /* executing here. */

    ((ICummunicationObject)proxy).Close();
}

并称之为:

IList<string> result = null;
BooksProxy.Execute(proxy => { result = proxy.GetStrings(); });

不太确定如何做到这一点......

1 个答案:

答案 0 :(得分:2)

好的,所以我想办法怎么做。

这是代理,其目的是使其成为通用代码:

SELECT table_name,GROUP_CONCAT(column_name ORDER BY ordinal_position)
FROM information_schema.columns
WHERE table_schema = DATABASE()
GROUP BY table_name
ORDER BY table_name

现在就是诀窍:

对于void方法:

public class Proxy<T>
{
    public ChannelFactory<T> Channel { get; set; }

    public Proxy()
    {
        Channel = new ChannelFactory<T>("endpoint");
    }

    public T CreateChannel()
    {
        return Channel.CreateChannel();
    }
}

返回:

public void Execute(Action<T> action)
{
    T proxy = CreateChannel();

    action(proxy);

    ((ICommunicationObject)proxy).Close();
}

TResult是返回类型。

使用方法:

public TResult Execute<TResult>(Func<T, TResult> function)
    {
        T proxy = CreateChannel();

        var result = function(proxy);

        ((ICommunicationObject)proxy).Close();

        return result;
    }

因此,总而言之,代理类应该是这样的:

Proxy<IService> proxy = new Proxy();
// for a void method
Proxy.Execute(prxy => prxy.Method());
// for non void method.
var result = Proxy.Execute(prxy => prxy.Method());

我推荐这个解决方案用于自定义wcf代理而不使用任何服务引用,它非常简单易用。