【发布时间】: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