你聽說過AOP(Aspect Oriented Programming)嗎?這是一種將橫切關注點作爲可重用方面的方式,它們圍繞目標類型進行包裝,並在其包裝的方法之前或之後執行額外的處理。
http://en.wikipedia.org/wiki/Decorator_pattern
在一個WCF環境中,這通常通過將「行爲」爲您服務類完成。在這種情況下,我會建議IOperationBehavior接口使用實現IParameterInspector的屬性,以便在參數傳遞之前查看參數,創建並調用服務實例。這裏是一個有用的文章的鏈接,它更深入地討論了擴展wcf消息管道的選項。
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,
};
}
我不明白。 Logging類的代碼是什麼?或者你在問什麼?你想記錄什麼? – tallseth
我認爲讓人難以理解的問題是您沒有存儲對新日誌記錄實例的引用。因此它不能在* using *塊中調用。這是意圖嗎?你是否想在每個服務方法之前調用一個方法,或者2)創建一個傳入並由每個服務方法使用的實例? – ErnieL
對不起,我感到困惑。我只想在每種服務方法之前使用一種方法。 – katie77