Heb je gehoord van AOP (Aspect Oriented Programming)? Het is een manier om transversale problemen te implementeren als herbruikbare aspecten die het doeltype omwikkelen en aanvullende verwerking uitvoeren vóór of na de methode die ze inpakken.
http://en.wikipedia.org/wiki/Decorator_pattern
Binnen een WCF-omgeving wordt dit meestal gedaan door "Behaviors" toe te passen op uw serviceklasse. In dit geval zou ik de IOperationBehavior-interface willen voorstellen met een kenmerk dat IParameterInspector implementeert om de parameters te bekijken voordat ze worden doorgegeven, de service-instantie wordt gemaakt en aangeroepen. Hier is een link naar een nuttig artikel dat dieper ingaat op uw mogelijkheden om de berichtenpool van de wcf uit te breiden.
http://msdn.microsoft.com/en-us/magazine/cc163302.aspx
//Attribute class
public class LogOperationBehavior : Attribute, IOperationBehavior, IParameterInspector {
public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) {
return;
}
public void ApplyClientBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.ClientOperation clientOperation) {
//clientOperation.ParameterInspectors.Add(new ClientParameterInspector());
}
public void ApplyDispatchBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation) {
dispatchOperation.ParameterInspectors.Add(this);
}
public void Validate(OperationDescription operationDescription) {
return;
}
#region IParameterInspector Members
public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState) {
//perform logging after
}
public object BeforeCall(string operationName, object[] inputs) {
//perform logging before
return null;
}
#endregion
}
public class BusinessOperation : IBusinessOperation {
//Apply to your service via an attribute
[LogOperationBehavior]
public DivideResponse DivideTwoNumbers(DivideRequest dr) {
return new DivideResponse() {
Answer = dr.Numerator/ dr.Demoninator2,
};
}