【问题标题】:How to expose classes that implement interfaces and use unmanaged resources?如何公开实现接口并使用非托管资源的类?
【发布时间】:2010-06-26 14:23:23
【问题描述】:

我有一个关于在使用非托管资源时使用接口的问题。 假设我有一个 Web 服务并生成了 WCF 客户端。服务合约如下所示:

[ServiceContract]
public interface ITestService
{
    [OperationContract]
    string GetData(int value);
}

在客户端,我使用依赖注入并将 ITestService 接口绑定到 TestServiceClient(使用 svcutil 生成)。但是,当我创建 ITestService 并且它确实是 TestServiceClient 时,它应该以正确的方式进行处理,但客户不知道它。 你如何处理这个问题?

我想过像这样生成代理类:

class TestServiceClientProxy : ITestService
{
    #region ITestService Members

    public string GetData(int value)
    {
        var client = new TestServiceClient();
        bool success = false;
        try
        {
            var result = client.GetData(value);
            client.Close();
            success = true;
            return result;
        }
        finally
        {
            if (!success)
            {
                client.Abort();
            }
        }
    }

    #endregion
}

但是,我认为代码生成并不是最好的方法。我应该使用一些 AOP 框架还是 DynamicProxy?

提前感谢您的帮助。

【问题讨论】:

  • 绑定工厂而不是代理接口有什么好处?你的意思是通过使用工厂你可以把代理放在使用块中,对吧?我的问题是 wcf 代理不应该用于使用块:stackoverflow.com/questions/573872/…,我不能强迫我的所有客户记住编写正确的代码。
  • 您始终可以使用 IDisposable 包装器装饰实际实现,该包装器在其 Dispose 方法中正确关闭客户端。这将允许您在 using 块中拥有代理接口并仍然安全地关闭它。

标签: c# .net wcf dependency-injection unmanaged


【解决方案1】:

声明你的接口实现了 IDisposable,在具体类中实现 Dispose(),你的 DI 提供者会正确地处理它。如果您的 DI 提供商不这样做,请找一个新的。

[ServiceContract]
public interface ITestService : IDisposable
{
    [OperationContract]
    string GetData(int value);
}

【讨论】:

  • @Josh Einstein:这不是关于服务,而是关于客户
  • @Jame Ide:将 IDisposable 添加到我的接口定义会强制我的服务用户记住通过 DI 容器释放它。更重要的是,如果我想创建服务模拟,我需要定义完全没有必要的 Dispose。
  • @empi,我的错你是对的。我将问题解释为如何通过客户端的 IDisposable 实现来“处理”服务的服务器端。
猜你喜欢
  • 2012-03-28
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
相关资源
最近更新 更多