如何公开实现接口并使用非托管资源的类?

发布于 2024-09-07 12:18:15 字数 1003 浏览 5 评论 0原文

我有一个关于非托管资源发挥作用​​时接口使用的问题。 假设我有一个 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?

预先感谢您的帮助。

I have a question regarding use of interfaces when unmanaged resources come to play.
Suppose I have a web service and generated WCF client. Service contract looks like this:

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

On client side I use dependency injection and bind ITestService interface to TestServiceClient (generated with svcutil). However, when I create ITestService and it really is TestServiceClient it should be disposed in correct way but the clients don't know about it.
How do you deal with this problem?

I thought about generating proxy classes like this:

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
}

However, I don't think code generation would be best way to go. Should I use some AOP framework or DynamicProxy?

Thanks in advance for help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱殇璃 2024-09-14 12:18:15

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

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

Declare that your interface implements IDisposable, implement Dispose() in the concrete class, and your DI provider will dispose it properly. If your DI provider doesn't do this, find a new one.

[ServiceContract]
public interface ITestService : IDisposable
{
    [OperationContract]
    string GetData(int value);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文