我有以下情况:
服务Web项目(Web应用程序)
界面Web项目(Web应用程序)
在两个服务(A和B)中,我都有返回ExceptionResponseMessage类的方法。在界面web项目中,我将其称为“客户端”,为便于参考,此类生成两次:
我想在我的客户端创建一个函数来处理响应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类型,它表明接口在客户端中没有得到遵守。
有谁知道如何让客户端类实现接口?
答案 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响应,然后可以将其序列化到您正在使用的异常响应类中。