357. Implementing an interception framework – Introduction

הכרנו בעבר את הרעיון של Interception, וראינו מספר דוגמאות שאפשר לממש באמצעות רעיון זה.

ישנן עוד מספר דוגמאות יפות שנראה בהמשך שניתן להשתמש בInterception כדי לממש אותן, אותן נראה בהמשך.

כעת נתחיל נדבר על בניית Framework לInterception.


נתחיל לדבר על מה אנחנו רוצים לעשות. אנחנו בעצם רוצים לכתוב Framework כך שיהיה לנו נוח לעשות Interception משלנו.

מה שאנחנו בעצם מצפים מFramework כזה זה שיהיה איזשהו ממשק שאנחנו נוכל לממש, וברגע שנממש אותו, נוכל “להתקין” אותו על איזשהו Container/טיפוס כדי שתקרא הפונקציה של הממשק במקום.

נקרא לצורך העניין לממשק שאנחנו מעוניינים לממש Interceptor והוא באופן לא מפתיע יראה כך:

1
2
3
4
public interface IInterceptor
{
void Intercept(MethodCallInfo call);
}

כעת כל הInterceptים שראינו עד כה יהיו Interceptorים אותם נתקין איכשהו:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class LoggingInterceptor : IInterceptor
{
public void Intercept(MethodCallInfo call)
{
Console.WriteLine("Entering {0}, with parameters {1}",
call.Method,
GetParameters(call));
try
{
call.Proceed();
Console.WriteLine("Exiting {0} with return value: {1}",
call.Method,
call.ReturnValue);
}
catch (Exception ex)
{
Console.WriteLine("An error occured on " + call.Method, ex);
throw;
}
}
private static string GetParameters(MethodCallInfo call)
{
return string.Join
(",",
call.Method.GetParameters().Select(x => x.Name + ":" + call.Arguments[x.Position]));
}
}

קיימים מספרים Frameworkים נחמדים המאפשרים Interception.

בהמשך נסקור Frameworkים אלה ונדבר על איך הם עובדים.

אחר כך נחזור לעוד דוגמאות לדברים שאפשר לממש עם Interception.

המשך יום מיורט לטובה!

שתף