locked
MVVM - Locator defenition RRS feed

  • שאלה

  • שלום לכולם,

    יש לי אפליקציית winform הכוללת פרויקט wpf מסוג class library.
    פרויקט ה wpf ממומש בארכיטקטורת mvvm וכאשר הגעתי להגדרה של ה-Locator נתקלתי בבעיה מכיוון שבדרך כלל מגדירים אותו בקובץ ה-app.xaml וכידוע אין בפרויקט מסוג class library  קובץ כזה.
    פתרתי את זה בדרך הבאה: ב- code behind של החלון הראשי הוספתי ב- constructor ל- resources של האפליקציה את ה-Locator.
    הבעיה שלי היא שב design time  כל ה- viewmodels לא מכירים את ה-Locator, יש לציין שבזמן ריצה אין שום בעיה.

    תודה מראש :)

    יום ראשון 26 פברואר 2012 09:05

תשובות

  • הי אלעד,

    הבעיה שאתה מתאר היא די נפוצה - הפתרון הוא לשים גם קובץ app.xaml באפליקציית הWPF וגם קונסטרקטור (או מתודה אחרת שתקרא ישירות על ידי הקוד המפעיל - במקרה הזה ווינפורמז) שתוסיף את כל ה resources הנצרכים. 

    כך תהיה לך גם תמיכה לזמן עיצוב, וגם זה יעבוד בזמן ריצה.

    בדר"כ במקרים כאלו אני יוצר קובץ resources.xaml שמכיל את כל הresources שבדר"כ נמצאים ב app.xaml, ואז ב app.xaml אני מקשר ל resources.xaml וגם בקונסטרטור (או במתודה כלשהי כאמור) אני טוען את קובץ הresources בצורה דינאמית:

    			Application.Current.Resources =
    				new ResourceDictionary { Source = new Uri(
    					"pack://application:,,,/TheWpfDll;component/MainResources.xaml"
    					, UriKind.RelativeOrAbsolute) };

    אגב, נתקלים בזה הרבה מאוד גם בפריזם, כשאתה רוצה להריץ DLL אחד (מודול אחד) גם מתוך הshell וגם בנפרד לחלוטין.

    בנוסף, שים לב שכדאי שאפליקציית הWPF תהיה אפליקציית ריצה (ולא רק DLL) כי כך תוכל לפתח אותה בנפרד לחלוטין, ולהריץ אותה פעם לבד ופעם בתוך הcontainer של אפליקציית ה ווינפורז הישנה.


    http://blogs.microsoft.co.il/blogs/eladkatz @ElatKt



    • נערך על-ידי Elad R Katz יום ראשון 26 פברואר 2012 11:52
    • סומן כתשובה על-ידי Elad547 יום ראשון 26 פברואר 2012 12:24
    יום ראשון 26 פברואר 2012 11:51
  • אני  מאוד חושב שאתה כן מעוניין להיות מסוגל להריץ את הDLL הזה באופן נפרד. 

    זה אכן טריק, אבל זה אחלה טריק, והוא מאוד נקי לדעתי. אני לא מכיר דרך יותר טובה לפתור את זה.

    יחד עם זאת, אני מאוד רוצה להדגיש כי זה לא באג - זה פיצ'ר - אתה *מאוד* מעוניין להיות מסוגל להריץ כל חלק באפליקציה בנפרד - אני אישית מאוד מתאמץ בכל אפליקציה שאני כותב שזה יהיה כך, וזה מאפשר יכולות הרבה יותר חשובות מMVVM אגב (אבל זה כבר נושא לדיון אחר...)


    http://blogs.microsoft.co.il/blogs/eladkatz @ElatKt

    • סומן כתשובה על-ידי Elad547 יום ראשון 26 פברואר 2012 12:24
    יום ראשון 26 פברואר 2012 12:16

כל התגובות

  • הי אלעד,

    הבעיה שאתה מתאר היא די נפוצה - הפתרון הוא לשים גם קובץ app.xaml באפליקציית הWPF וגם קונסטרקטור (או מתודה אחרת שתקרא ישירות על ידי הקוד המפעיל - במקרה הזה ווינפורמז) שתוסיף את כל ה resources הנצרכים. 

    כך תהיה לך גם תמיכה לזמן עיצוב, וגם זה יעבוד בזמן ריצה.

    בדר"כ במקרים כאלו אני יוצר קובץ resources.xaml שמכיל את כל הresources שבדר"כ נמצאים ב app.xaml, ואז ב app.xaml אני מקשר ל resources.xaml וגם בקונסטרטור (או במתודה כלשהי כאמור) אני טוען את קובץ הresources בצורה דינאמית:

    			Application.Current.Resources =
    				new ResourceDictionary { Source = new Uri(
    					"pack://application:,,,/TheWpfDll;component/MainResources.xaml"
    					, UriKind.RelativeOrAbsolute) };

    אגב, נתקלים בזה הרבה מאוד גם בפריזם, כשאתה רוצה להריץ DLL אחד (מודול אחד) גם מתוך הshell וגם בנפרד לחלוטין.

    בנוסף, שים לב שכדאי שאפליקציית הWPF תהיה אפליקציית ריצה (ולא רק DLL) כי כך תוכל לפתח אותה בנפרד לחלוטין, ולהריץ אותה פעם לבד ופעם בתוך הcontainer של אפליקציית ה ווינפורז הישנה.


    http://blogs.microsoft.co.il/blogs/eladkatz @ElatKt



    • נערך על-ידי Elad R Katz יום ראשון 26 פברואר 2012 11:52
    • סומן כתשובה על-ידי Elad547 יום ראשון 26 פברואר 2012 12:24
    יום ראשון 26 פברואר 2012 11:51
  • הי אלעד,

    יש לי בעיה עם הפתרון הזה מכיוון שאני לא מעוניין להגדיר את הפרויקט כאפליקציית ריצה אלא כ-dll , ובעקבות זאת לא ניתן ליצור קובץ app.xaml (הפרויקט לא מתקמפל).
    הדרך היחידה לקמפל את הפרויקט עם הקובץ -app.xaml היא לשנות את ה build action של ה-app.xaml ל- content או page אבל אז חוזרת לי הבעיה שכל ה- viewmodels לא מכירים את ה-Locator 

    יום ראשון 26 פברואר 2012 12:00
  • מה ההבדל?

    בתכל'ס זה פשוט DLL עם סיומת EXE. אתה יכול לשנות את הסיומת ל DLL בסוף ה build אם אתה רוצה 


    http://blogs.microsoft.co.il/blogs/eladkatz @ElatKt

    יום ראשון 26 פברואר 2012 12:02
  • ההבדל הוא שאני לא מעוניין שיהיה ניתן להריץ את ה-dll הזה באופן נפרד.
    ואחרי ה-build לשנות את הסיומת ל-dll זו מעין קומבינה, השאלה אם אפשר לפתור את זה בצורה נקייה?
    יום ראשון 26 פברואר 2012 12:14
  • אני  מאוד חושב שאתה כן מעוניין להיות מסוגל להריץ את הDLL הזה באופן נפרד. 

    זה אכן טריק, אבל זה אחלה טריק, והוא מאוד נקי לדעתי. אני לא מכיר דרך יותר טובה לפתור את זה.

    יחד עם זאת, אני מאוד רוצה להדגיש כי זה לא באג - זה פיצ'ר - אתה *מאוד* מעוניין להיות מסוגל להריץ כל חלק באפליקציה בנפרד - אני אישית מאוד מתאמץ בכל אפליקציה שאני כותב שזה יהיה כך, וזה מאפשר יכולות הרבה יותר חשובות מMVVM אגב (אבל זה כבר נושא לדיון אחר...)


    http://blogs.microsoft.co.il/blogs/eladkatz @ElatKt

    • סומן כתשובה על-ידי Elad547 יום ראשון 26 פברואר 2012 12:24
    יום ראשון 26 פברואר 2012 12:16