在我们公开WCF服务的外部边界中,我们将所有内部异常转换为FaultException.这是一个手动过程,通常每个实现都有一些独特的缺陷.对于每种暴露的方法,它都经过复制/粘贴和无意识修改(或忘记).为了减少错误,我想创建一个可以捕获任何未处理异常的方面.
我们将内部异常映射到故障异常.如何向方面发送映射功能?
如果我向这个方面添加一个属性,如下所示:
[Serializable]
public sealed class FaultExceptionConverter : OnExceptionAspect {
public Func<Exception, FaultException> FaultConverter { get; set }
}
Run Code Online (Sandbox Code Playgroud)
我不能(正如属性限制所预期的那样)初始化它[FaultExceptionConverter(FaultConverter = MyConversionMethod)](在哪里MyConversionMethod可以分配给某些方法Func<Exception, FaultException>).是否有任何模式可以将此类参数传递给方面?许多类型可以传递到方面.这是个常见的问题吗?
如果碰巧有更好的方法来实现这一目标,我将不胜感激.
我在方面实现中遇到了类似的令人沮丧的限制,我用来解决这些限制的一种方法是让方面将其实现的类视为某种“提供者”类型,它可以回调以请求其他位在运行时。
所以,就你的情况而言,我想象一个 OnException 重写看起来像这样;
public override void OnException(MethodExecutionArgs args)
{
IFaultConverterProvider provider = args.Instance as IFaultConverterProvider;
if (null != provider)
Func<Exception, FaultException>exceptionConverterFunc = provider.GetFunc();
}
Run Code Online (Sandbox Code Playgroud)
您在属性类型上定义和实现的某个接口在哪里IFaultConverterProvider,以提供您缺少的额外参数。
然后,作为一点健全性检查,您可以在方面中引入一些编译时验证,以确保它所应用的类型实际实现此所需的接口;
public override bool CompileTimeValidate(Type type)
{
if (!type.IsImplementationOf(typeof(IFaultConverterProvider )))
{
// The aspect must be in a type which implements IFaultConverterProvider
Message.Write(
MessageLocation.Of(type),
SeverityType.Error,
"CUSTOM02",
"Cannot apply [MyFaultExceptionAspect] to type {0} because it does not implement IFaultConverterProvider .", type);
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
320 次 |
| 最近记录: |