276. Type Forwarding in the CLR

[נכתב ע”י ולרי פליסקין]

היום זלינגר ביקש ממני לכתוב את הטיפ היומי.

רציתי לשתף אתכם בfeature נחמד של .NET הנקרא: Type forwarding.

נבחן את הבעיה הבאה: יש לנו assembly בשם MyAssembly שבין היתר, מכיל בתוכו מחלקה בשם MySuperClass. ואנחנו משתמשים במחלקה הזאת באפליקציה אחרת שלנו (MyApp), בעזרת Assembly reference סטנדרטי.

יום אחד החלטנו לעשות refactoring לMyAssembly והגענו למסקנה שזה לא מקום טוב עבור MySuperClass והוא צריך לשבת בassembly אחר בשם: MySuperAssembly.

עשינו את כל השינויים, קימפלנו מחדש גם את MyAssembly וגם את MySuperAssembly וגילינו במהרה שהאפליקציה שלנו - MyApp זורקת שגיאה כי היא לא מוצאת יותר את המחלקה MySuperClass, מפני שהוא כבר לא נמצא בMyAssembly.

דרך אחת היא לעשות refactoring באפליקציה שלנו ולהוסיף reference נוסף לMySuperAssembly, אבל לא תמיד אנחנו יכולים לפתוח את הקוד של כל האפליקציה, מה גם שלפעמים הDLL שלנו הוא תשתיתי והרבה אפליקציות אחרות משתמשות בו, הרי לא נעבור ונוסיף עכשיו בכל אחת מהן את הreference לMySuperAssembly.

כאן נכנס לתמונה הattribute הנחמד בשם: TypeForwardedToAttribute

נוציא את המחלקה MySuperClass מתוך MyAssembly ונעביר אותה לMySuperAssembly.

לאחר שהזזנו את המחלקה שלנו מMyAssembly ל MySuperAssembly, נוסיף את השורה הבאה בקובץ AssemblyInfo.cs של MyAssembly:

1
[assembly : TypeForwardedTo(typeof(MySuperClass))]

עכשיו נקמפל את הMySuperAssembly שמכיל את המחלקה MySuperClass לאחר הrefactoring שבצענו.

עכשיו נותר לנו רק להוסיף reference של הMySuperAssembly לMyAssembly ולקמפל מחדש את MyAssembly.

נקודה חשובה: צריך לשמור על שם הnamespace המקורי של MySuperClass גם לאחר שהעברנו אותו לAssembly אחר.

שתף