У меня есть эта ситуация: у меня есть служба WCF. Я обрабатываю все исключения на MyErrorHandler
с реализованным интерфейсом IErrorHandler
. Ниже приведен весь рабочий код.Как ввести объект в IErrorHandler WCF?
Что я хочу делать, но понятия не имею, как: Я хочу ввести объект (например, ILogger) в класс MyErrorHandler
. В основном это означает, что мне нужно ввести объект здесь: [GlobalErrorHandlerBehaviour(typeof(MyErrorHandler))]
. Не могли бы вы помочь мне решить эту проблему?
[ServiceContract]
public interface ITestService
{
[OperationContract]
int GetTest();
}
[GlobalErrorHandlerBehaviour(typeof(MyErrorHandler))]
public class TestService : ITestService
{
public TestService(ILogger logger)
{
// Here, I'm already injecting logger.
// It's not imported for my question so I removed it for now
}
public int GetTest()
{
throw new Exception("Test");
}
}
// This is attribute added to TestService class
// How can I inject (via constructor) ILogger, or any other class??
public class GlobalErrorHandlerBehaviourAttribute : Attribute, IServiceBehavior
{
private readonly Type errorHandlerType;
public GlobalErrorHandlerBehaviourAttribute(Type errorHandlerType)
{
this.errorHandlerType = errorHandlerType;
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
IErrorHandler handler = (IErrorHandler)Activator.CreateInstance(errorHandlerType);
foreach(ChannelDispatcherBase channelDispatcherBase in serviceHostBase.ChannelDispatchers)
{
ChannelDispatcher channelDispatcher = channelDispatcherBase as ChannelDispatcher;
if (channelDispatcher != null)
{
channelDispatcher.ErrorHandlers.Add(handler);
}
}
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
}
public class MyErrorHandler : IErrorHandler
{
//--------------------------------------------------//
// I MUST INJECT ILOGGER HERE (or any other object) //
//--------------------------------------------------//
public bool HandleError(Exception error)
{
return true;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
FaultException fe = new FaultException();
MessageFault message = fe.CreateMessageFault();
fault = Message.CreateMessage(version, message, null);
}
}
КПП. Я хочу использовать DI и вводить что-то в IErrorHandler
Я не хочу использовать метод private static readonly
с регистратором.
Почему вернуть '' true' в IErrorHandler.HandleError (ошибка Exception) ' ? [Документация] (https://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.ierrorhandler.handleerror (v = vs.110) .aspx) говорит: ** 'true' **' if Windows Communication Foundation (WCF) не должен прерывать сеанс (если он есть) и контекст экземпляра, если контекст экземпляра не является Single; в противном случае '**' false' ** '. По умолчанию используется '**' false' ** '.' Почему вы хотите продолжить сеанс и контексты экземпляра после критической ошибки? Тем более, что вы не обрабатываете его, вы просто регистрируете его. –