如何使两个不同的服务引用实现相同的接口?

时间:2014-05-13 18:41:57

标签: c# .net wcf interface

我有以下情况:

  • 服务Web项目(Web应用程序)

    • ServiceA.svc
    • ServiceB.svc
    • ExceptionResponseMessage.cs
  • 界面Web项目(Web应用程序)

    • 服务参考:
      • ServiceAServiceReference
      • ServiceBServiceReference

在两个服务(A和B)中,我都有返回ExceptionResponseMessage类的方法。在界面web项目中,我将其称为“客户端”,为便于参考,此类生成两次:

  • ServiceAServiceReference.ExceptionResponseMessage
  • ServiceBServiceReference.ExceptionResponseMessage

我想在我的客户端创建一个函数来处理响应Message,看看是否有任何错误并正确处理它。由于我有两个类的副本,我将不得不创建两个方法:

public static void HandleError(ServiceAServiceReference.ExceptionResponseMessage ex)
{
    (Method Implementation here)
}

public static void HandleError(ServiceBServiceReference.ExceptionResponseMessage ex)
{
    (Method Implementation here)
}

我想避免这种情况,所以我在不同的类库项目中创建了一个接口,服务和客户端项目都可以访问。 ExceptionResponseMessage实现此接口。

问题是客户端为“ExceptionResponseMessage”生成了类,但没有实现该接口。我甚至在界面和对象中创建了一个自引用“InnerException”属性,如下所示:

public interface IExceptionResponseMessage {
    IExceptionResponseMessage InnerException { get; set; }
}

public class ExceptionResponseMessage : IExceptionResponseMessage
{
    public IExceptionResponseMessage InnerException { get; set; }
}

但是当我检查客户端生成的对象时,它说InnerException属性是Object类型,它表明接口在客户端中没有得到遵守。

有谁知道如何让客户端类实现接口?

2 个答案:

答案 0 :(得分:1)

通常我不建议使用dynamic,因为在运行时会出现失败的风险,但由于您已经在错误处理程序中,因此可能值得冒这个风险:

public static void HandleError(dynamic ex)
{
    //(Method Implementation here)
}

这样您就可以使用异常类型共有的属性和方法。如果你想要智能感知,你可以在开发期间强类型它,并在处理程序完成后更改为dynamic

风险在于,如果使用不存在的方法/属性,则在运行时失败。您可以通过处理Microsoft.CSharp.RuntimeBinder.RuntimeBinderException例外来减少该错误的影响:

public static void HandleError(dynamic ex)
{
    try
    {
        //(Method Implementation here)
    }
    catch(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException rbex)
    {
        // do something (or ignore)
    }
    // all other exceptions are bubbled up
}    

更安全的解决方案是保持重载并制作dynamic方法private

public static void HandleError(ServiceAServiceReference.ExceptionResponseMessage ex)
{
    HandleErrorDynamic(ex);
}

public static void HandleError(ServiceBServiceReference.ExceptionResponseMessage ex)
{
    HandleErrorDynamic(ex);
}
private static void HandleErrorDynamic(dynamic ex)
{
    //(Method Implementation here)
}    

通过这种方式,您可以控制传递给动态方法的内容,并可以编写可以防止运行时错误的单元测试。

答案 1 :(得分:1)

放弃返回类实例的服务方法,而是返回string xml响应,然后可以将其序列化到您正在使用的异常响应类中。