解耦 ErrorHandlerAttribute 从服务实现注册
要为所有服务分离和重用相同的错误记录代码,你需要两个样板类并将它们放在某个库的某个库中。
ErrorhandlerAttribute 实现 IServiceBehavior。FaultErrorhandler 实现 IErrorhandler,记录所有异常。
[AttributeUsage(AttributeTargets.Class)]
public class ErrorHandlerAttribute : Attribute, IServiceBehavior
{
Type mErrorType;
public ErrorHandlerAttribute(Type t)
{
if (!typeof(IErrorHandler).IsAssignableFrom(t))
throw new ArgumentException("Type passed to ErrorHandlerAttribute constructor must inherit from IErrorHandler");
mErrorType = t;
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
{
dispatcher.ErrorHandlers.Add((IErrorHandler)Activator.CreateInstance(mErrorType));
}
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
}
class FaultErrorHandler : IErrorHandler
{
public bool HandleError(Exception error)
{
// LOG ERROR
return false; // false so the session gets aborted
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
}
}
然后在你的服务实现中添加在 FaultErrorHandler 的 Type 实例中传递的 ErrorHandler 属性。ErrorHandler 将从调用 HandleError 的类型构造一个实例。
[ServiceBehavior]
[ErrorHandler(typeof(FaultErrorHandler))]
public class MyService : IMyService
{
}