Я не уверен в коде, который вы используете для разрешения этого объекта журнала:
private static readonly ILog log =
LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType
);
Это всегда будет разрешать тип, в котором написана строка кода, так как сначала разрешается автоматически определенный статический конструктор (с MethodInfo.GetCurrentMethod()
окружающего класса), а затем он получает свой тип объявления.
Ну, я говорю всегда ...
Мне не нравится этот тип паттерна, поскольку он неявно опирается на код, который вы сами не написали физически (и, следовательно, внутреннюю особенность компилятора, которая может изменить в любое время); было бы немного лучше, если бы вы явно поместили его в статический конструктор, который вы пишете сами.
Если вы хотите сделать это, используйте
typeof(_whatever_type_you_declare_it_in_);
... не полагайтесь на компилятор и среду выполнения.
В равной степени - у меня такое чувство, что вы можете использовать этот шаблон из-за ошибочного убеждения, что он разрешит службу, для которой определен атрибут, но не будет.
Планируете ли вы иметь возможность управлять журналом, который будет использоваться на уровне обслуживания, с уровнем поведения по умолчанию?
Если это так, то я предлагаю вам:
1) Добавьте к своему поведению свойство ILog
уровня экземпляра, которое называется _serviceLog
2) В вашей реализации ApplyDispatchBehaviour
сделайте это:
_serviceLog = LogManager.GetLogger(serviceDescription.ServiceType);
3) И тогда ваша реализация HandleError
может выглядеть следующим образом:
public bool HandleError(Exception error)
{
//use the service-level log, or a default
ILog targetLog = _serviceLog ?? log;
if(targetLog != null)
targetLog.Error("Page Load failed : " + error.Message);
return false;
}