首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确调用WCF ServiceClient代理扩展?

如何正确调用WCF ServiceClient代理扩展?
EN

Stack Overflow用户
提问于 2017-07-23 17:15:50
回答 1查看 70关注 0票数 1

在解决wcf客户端问题时,我遇到了一些来自@marc-gravell 这里的代码。我读了几遍这篇文章,然后决定试着看看我是否能真正使用这些代码,所以我创建了一个控制台应用程序,并将其全部删除。

包装纸:

代码语言:javascript
复制
public interface IDisposableWrapper<T> : IDisposable
{
    T BaseObject { get; }
}

public class DisposableWrapper<T> : IDisposableWrapper<T> where T : class, IDisposable
{
    public T BaseObject { get; private set; }
    public DisposableWrapper(T baseObject) { BaseObject = baseObject; }
    protected virtual void OnDispose()
    {
        BaseObject.Dispose();
    }
    public void Dispose()
    {
        if (BaseObject != null)
        {
            try
            {
                OnDispose();
            }
            catch
            {
                // swallow...
            }
        }
        BaseObject = null;
    }
}

延期:

代码语言:javascript
复制
public static class DisposableExtensions
{
    // core "just dispose it without barfing"
    public static IDisposableWrapper<T> Wrap<T>(this T baseObject)
        where T : class, IDisposable
    {
        if (baseObject is IDisposableWrapper<T>) return (IDisposableWrapper<T>)baseObject;
        return new DisposableWrapper<T>(baseObject);
    }

    // specific handling for service-model
    public static IDisposableWrapper<TProxy> Wrap<TProxy, TChannel>(this TProxy proxy)
        where TProxy : ClientBase<TChannel>
        where TChannel : class
    {
        return new ClientWrapper<TProxy, TChannel>(proxy);
    }
}

ClientWrapper:

代码语言:javascript
复制
public class ClientWrapper<TProxy, TChannel> : DisposableWrapper<TProxy>
    where TProxy : ClientBase<TChannel>
    where TChannel : class
{
    public ClientWrapper(TProxy proxy) : base(proxy)
    {
    }

    protected override void OnDispose()
    {
        // lots of code per state of BaseObject
        //State != CommunicationState.Faulted;
    }
}

现在,当我使用它的时候,我有一个:

代码语言:javascript
复制
static void Main(string[] args)
{

    using (var proxy = new PLPlacementServiceClient())
    {
        var result = proxy.GetDocumentClassForNewBusiness();
    }

    using (var proxy = new PLPlacementServiceClient().Wrap())
    {
        var result = proxy.BaseObject.GetDocumentClassForNewBusiness();
    }

    using (var proxy = new PLPlacementServiceClient().Wrap<>())//what goes here?
    {
        var result = proxy.BaseObject.GetDocumentClassForNewBusiness();
    }

}

当我使用PLPlacementServiceClient().Wrap()方法( F-12 )时,它会带我到扩展类中的非泛型实现。

代码语言:javascript
复制
IDisposableWrapper<T> Wrap<T>(this T baseObject)

,但我本来想被带到另一个签名的

代码语言:javascript
复制
IDisposableWrapper<TProxy> Wrap<TProxy, TChannel>(this TProxy proxy)

下面是我的问题,“如何调用扩展的ClientBase版本?”

谢谢你,斯蒂芬

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-23 19:08:18

必须为方法包装指定两个类型参数。这就是:

代码语言:javascript
复制
using (var proxy = new PLPlacementServiceClient().Wrap<PLPlacementServiceClient,/*type of the service contract PLPlacementServiceClient is implementing*/>())
{
    var result = proxy.BaseObject.GetDocumentClassForNewBusiness();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45267841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档