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

本文关键字:执行 方法 服务 访问 调用 创建 代理 一个 WCF | 更新日期: 2023-09-27 18:27:40

我正在使用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(); });

不太确定该怎么做。。。

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

好的,所以我想好了怎么做。

这是代理,想法是使其通用:

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();
}

退货:

public TResult Execute<TResult>(Func<T, TResult> function)
    {
        T proxy = CreateChannel();
        var result = function(proxy);
        ((ICommunicationObject)proxy).Close();
        return result;
    }

其中,TResult是返回类型。

如何使用:

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());

总之,代理类应该是这样的:

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();
        }
        public TResult Execute<TResult>(Func<T, TResult> function)
        {
            T proxy = CreateChannel();
            var result = function(proxy);
            ((ICommunicationObject)proxy).Close();
            return result;
        }
    }

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