Ich habe viele Methoden, die einige Protokollierung mit dem gleichen Muster erfordern. Einige Methoden müssen einen Wert zurückgeben, andere nicht. Ich habe eine Methode mit Aktionsparameter erstellt, um zu vermeiden, dass die gesamte Logik kopiert wird. Es sieht wie folgt aus:Kombinieren von Aktion und Func in einem Parameter
private void Execute(Action action)
{
Logger.Start();
try
{
action();
}
catch(Exception exception)
{
Logger.WriteException();
throw;
}
finally
{
Logger.Finish();
}
}
Jetzt habe ich einige Anrufe, die wie die
public void DoSomething(string parameter)
{
Execute(() => GetProvider(parameter).DoSomething());
}
Aber ich eine Funktion benötigen, die Werte zurückgeben. Was sind die besten Möglichkeiten, dies zu tun? Ich habe zwei jetzt gefunden:
1) Erstellen Sie eine Kopie der Execute-Methode mit Func
private T Execute<T>(Func<T> action)
{
Logger.Start();
try
{
return action();
}
catch(Exception exception)
{
Logger.WriteException();
throw;
}
finally
{
Logger.Finish();
}
}
Dies funktioniert Methode hat aber auch einige Kopie einfügen.
2) Trick die Parameter in einer Aktion sein:
public Result DoSomething(string parameter)
{
Result result = null;
Execute(() => result = GetProvider(parameter).DoSomething());
return result;
}
Diese nicht kopieren und einfügen erfordert aber sieht nicht so schön.
Gibt es eine Möglichkeit, Action und Func beizutreten, um irgendeine dieser Methoden zu vermeiden oder gibt es eine andere Möglichkeit, dasselbe Ergebnis zu erzielen?
Ich benutze die zweite Ihrer Ansätze. Ich konnte keinen guten Weg finden, es anders zu machen, also würde ich mich freuen, Antworten auf deine Frage zu sehen! –
Es scheint damit verbunden zu sein: http://StackOverflow.com/q/4279210/55209 –
betrachten Aspekte verwenden http://StackOverflow.com/Questions/1416880/aspect-oriented-Programming-in-c-sharp – Lanorkin