解耦 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
{
}