locked
שליחת אובייקט עם מאפיין מסוג ObservableCollection RRS feed

  • שאלה


  • כרגע אני עובד על אפליקצית סילברלייט. כאשר יש לי Class Library משותף לServer ולClient שבה אני מחזיק את הmodels
    חלק מהאובייקטים בlibrary מכילים מאפיינים מסוג observablecollection. עד כאן הכל רגיל ועובד טוב. הבעיה נוצרת
    כאשר אני מנסה להעביר את האובייקטים מהמשתמש לשרת בעזרת WCF. אובייקטים שמכילים מאפיינים מסוג observablecollection אינם מצליחם לעבור ומכשילים את הservice. אשמח לדעת האם ישנה דרך מקובלת לפתור
    את הנושא. אני רוצה להימנע מלוותר על הסוג הזה של רשימה ולהימנע מלהשתמש באובייקטי proxy שמכילים list רגיל.

    תודה מראש.
    שבת 01 ספטמבר 2012 09:06

תשובות

  • שלום ניקיטה,

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

    שלב 1. יצירת מודל

    יצרתי קלאס, בתוך אסמבלי של framewrosk:

    public class DataModel
        {
            private ObservableCollection<int> _collection = new ObservableCollection<int>();
    
            public ObservableCollection<int> Collection
            {
                get
                {
                    return _collection;
                }
            }
        }


    2. יצרתי ווב סרביס בצד השרת. לקחתי רפרנס לאסמבלי של מודל

    אינטרפייס

     [ServiceContract]
        public interface IMyService
        {
            [OperationContract]
            void DoWork(DataModel model);
        }

    מימוש

    public class MyService : IMyService
        {
            public void DoWork(DataModel model)
            {
            }
        }

    3. יצרתי אסמבלי של סילברלייט, והוספתי לתוכו מודל מאסמבלי של framework

    4. בפרוייקט של סילברלייט, לקחתי רספרנס למודל בגרסא הסילברלייטית. כמו כן לקחתי רפרנס לסרביס.

    5. מבצע קריאה לסרביס:

    DataModel model = new DataModel();
                model.Collection.Add(1);
    
                ServiceReference1.MyServiceClient client = new ServiceReference1.MyServiceClient();
                client.DoWorkAsync(model);

    הכל עובד. אז תנסה לראות מה השוני.

    נ.ב. אולי אני קצת architecture-nazi, אבל בעניי דברים כמו ObservableCollection לא אמורים לצאת מגבולות של קליינט. מחר תעבור לשרת בלינוקס או תשכתב קליינט למשהו שלא סילברלייט (או פשוט תוסיף סוג חדש\נוסף של קליינט), ומה תעשה אז?

    • סומן כתשובה על-ידי Elad R Katz יום חמישי 06 ספטמבר 2012 23:20
    יום שלישי 04 ספטמבר 2012 11:32

כל התגובות

  • שלום ניקיטה,

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

    שלב 1. יצירת מודל

    יצרתי קלאס, בתוך אסמבלי של framewrosk:

    public class DataModel
        {
            private ObservableCollection<int> _collection = new ObservableCollection<int>();
    
            public ObservableCollection<int> Collection
            {
                get
                {
                    return _collection;
                }
            }
        }


    2. יצרתי ווב סרביס בצד השרת. לקחתי רפרנס לאסמבלי של מודל

    אינטרפייס

     [ServiceContract]
        public interface IMyService
        {
            [OperationContract]
            void DoWork(DataModel model);
        }

    מימוש

    public class MyService : IMyService
        {
            public void DoWork(DataModel model)
            {
            }
        }

    3. יצרתי אסמבלי של סילברלייט, והוספתי לתוכו מודל מאסמבלי של framework

    4. בפרוייקט של סילברלייט, לקחתי רספרנס למודל בגרסא הסילברלייטית. כמו כן לקחתי רפרנס לסרביס.

    5. מבצע קריאה לסרביס:

    DataModel model = new DataModel();
                model.Collection.Add(1);
    
                ServiceReference1.MyServiceClient client = new ServiceReference1.MyServiceClient();
                client.DoWorkAsync(model);

    הכל עובד. אז תנסה לראות מה השוני.

    נ.ב. אולי אני קצת architecture-nazi, אבל בעניי דברים כמו ObservableCollection לא אמורים לצאת מגבולות של קליינט. מחר תעבור לשרת בלינוקס או תשכתב קליינט למשהו שלא סילברלייט (או פשוט תוסיף סוג חדש\נוסף של קליינט), ומה תעשה אז?

    • סומן כתשובה על-ידי Elad R Katz יום חמישי 06 ספטמבר 2012 23:20
    יום שלישי 04 ספטמבר 2012 11:32
  • שלום יבגני,

    קודם כל, תודה רבה על התייחסות המפורטת. שנית אולי פספסתי משהו אבל נראה שיצרת שתי class library אחת של סילברלייט
    והשנייה של ווינדוס?  (אחת מהן כנראה מייבאת את הclassים בlink - ראה סעיף ארבע). ממה שידוע לי ניתן לעשות רפרנס
    לdll של סילברלייט מתוך וינדוס ובכך לעשות reuse למודלים בשני הצדדים (יתכן והיכולת לא מפותחת מספיק) ולשם אני חותר. במידה והבנתי אותך לא נכון אשמח אם תצרף את הפרוייקט שלך ואולי הסבר נוסף כיוון שאחרת זה נראה בדיוק כמו משהו שאני עשיתי ואני מקבל שגיאה של "Could not load assembly system.windows" אני מניח בגלל שהאובייקט observablecollection
    נמצא בdll-ים שונים בשתי הframeworks. לטעמי הבעיה שאני נתקל בה היא די קלאסית למישהו שמצד אחד מנסה לעשות
    reuse ומצד שני מנסה להתאים יותר לסביבת SL שבה רוב הפיתוח של האפליקציה. אשמח לקבל כיוונים נוספים / שיטות מקובלות
    לא לאבד את יכולתה של observablecollection ולהשמישה כרשימה גם בשרת. אולי Attribute שיגרום לcollection להיות מסוג אחר כאשר מדובר בframework של ווינדוס.

    תודה מראש. 

    יום שישי 07 ספטמבר 2012 05:33
  • כשסיימתי לכתוב את התגובה, לחצתי על המתג שמדליק את המוח והבנתי שכנראה הבעיה לא בobservablecollection אלא בשימוש בdll בשם System.windows אשר לא נמצא ב.net framework או לפחות לא תואם לזה של SL. כאשר
    הוספתי רפרנס אליו מתוך פרויקט השרת, זה הסתדר. אם זאת יש לי תחושה שאני עומד להיתקל בבעיות נוספות מהסוג הזה ולא תהיה
    ברירה אלא לשכפל. אם לדעתכם יש פתרון אחר אודה ואשמח לשמוע.

    יום שישי 07 ספטמבר 2012 08:40
  • ניקיטה, הפתרון הוא ביוק מה שאני אמרתי לך. פרוייקט שהוא לא מסוג סילברלייט אינו יכול לקחת רפרנס על ספרייה סילברלייטית. זו עובדה. לכן מה שעושים בשביל למנוע שיכפול, זה מייצרים ספריה נוספת עבור סילברלייט, ולתוכה מכניסים ע"י קישורים (Add As Link) קבצים מתוך ספרייה הלא-סילברלייטית. כך, כל שינוי בסיפריה אחת תשתקף בספריה השניה. צירפתי צילום מסך המראה איך לעשות זאת:

    • הוצע כתשובה על-ידי Aizikovich Evgeni יום שישי 07 ספטמבר 2012 10:51
    יום שישי 07 ספטמבר 2012 10:50