У меня есть требование для регистрации каждого вызова метода в службе WCF и любых исключений. Это привело к большому избыточному коду, потому что каждый метод должен включать в себя шаблон, подобный этому:
[OperationContract]
public ResultBase<int> Add(int x, int y)
{
var parameters = new object[] { x, y }
MyInfrastructure.LogStart("Add", parameters);
try
{
// actual method body goes here
}
catch (Exception ex)
{
MyInfrastructure.LogError("Add", parameters, ex);
return new ResultBase<int>("Oops, the request failed", ex);
}
MyInfrastructure.LogEnd("Add", parameters);
}
Есть ли способ инкапсулировать всю эту логику в атрибут MyServiceLoggingBehaviorAttribute
, который я мог бы применить к классу (или методам) службы следующим образом:
[ServiceContract]
[MyServiceLoggingBehavior]
public class MyService
{
}
Примечание # 1
Я понимаю, что это можно сделать с помощью Aspect-ориентированного программирования, но на С# единственный способ сделать это - изменить байт-код, который требует использования сторонний продукт, такой как PostSharp. Я хотел бы избежать использования коммерческих библиотек.
Примечание # 2
Обратите внимание, что приложения Silverlight являются основными потребителями этой услуги.
Примечание № 3
Протокол трассировки WCF является хорошим вариантом в некоторых случаях, но он не работает здесь, поскольку, как отмечалось выше, мне нужно проверить, а в случае изменения исключения, возвращаемого значения.