传递Func <>或类似于PostSharp方面

car*_*ett 5 .net c# postsharp

在我们公开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>).是否有任何模式可以将此类参数传递给方面?许多类型可以传递到方面.这是个常见的问题吗?

如果碰巧有更好的方法来实现这一目标,我将不胜感激.

RJ *_*han 2

我在方面实现中遇到了类似的令人沮丧的限制,我用来解决这些限制的一种方法是让方面将其实现的类视为某种“提供者”类型,它可以回调以请求其他位在运行时。

所以,就你的情况而言,我想象一个 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)