ניסיון קטן שביצעתי לאחרונה מצא חן בעיני ורציתי לחלוק אותו.
לכאורה שני טכנולוגיות שונות שנראה כי יש אפשרות לשלב ביניהם, האחת הינה Dynamics CRM 4.0 והשנייה Silverlight.
הרי ב- CRM יש אפשרות לשלב אלמנטים בדף כ- IFrames , אז מדוע לא נשלב דף Silverlight המארח Dashboard מגניב בעל גרפיקה ו- Control ים מגניבים ?
אז... כבר ביצעו זאת ויש אין ספור דוגמאות ברשת, אולי בעתיד נפנה לכמה מהן, אך זה לא נושא ה- Post.
היום ברצוני להראות כיצד ניתן להשתמש במנוע ה- Interoperability בין עולם ה- DOM וה- JavaScript לעולם ה- Silverlight , בו אנו כותבים Managed Code ונהנים מיכולות שונות כמו: קריאה לשירותי WCF בצורה קלה ומוכרת ואף מנועי ריצה שונים כגון: Garbage Collection ועוד. מה גם שבצורה הזו נוכל לכתוב את לוגיקת ה- Client Side עם Intelligence מלא וניצול החיבור בין Visual Studio ל- ALM לעבודה בגרסאות, צוותי פיתוח, Build ים ועוד.
ולשם שינוי, אנו נבצע את הדוגמא בצורה שהינה Supported לחלוטין.
ישנם דוגמאות ורעיונות בהן נוגעים בקובץ ה- Global.js ומחברים לכל האפליקציה את ה- Silverlight Control המצביע ל- XAP אחד המכיל לוגיקה. כאמור זה אינו נתמך ולא נדון באפשרות הזו כאן.
השיטה:
· ניצור דף Html פשוט המכיל אובייקט Silverlight המפנה לאפליקציית Silverlight בעלת מתודה המסומנת כ- Scriptable Member
· נבצע Customization לאחת הישויות, לדוגמא Contact
· נוסיף IFrame המפנה לאפליקציית ה- Silverlight
· ונוסיף קוד באחת ממתודות ה- OnChange שנבחר ובה נקרא לפונקציית ה- Silverlight שחשפנו.
לצורך הדוגמא כל שאנו צריכים זה לפתוח Visual Studio לייצר אפליקציית Silverlight הכוללת אפליקציית Web כ- Host.

נכריז על MainPage כ- [ScriptableType] ב- Loaded event נרשום את ה- Control כ- ScriptableObject מה שיאפשר לנו להגיע אליו מדף ה- Html. ונחשוף את אחת הפונקציות כ- [ScriptableMember]
לדוגמא:
namespace CRMSilverlight
{
[ScriptableType]
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
}
void MainPage_Loaded(object sender, RoutedEventArgs e)
{
HtmlPage.RegisterScriptableObject("CRM_SL", this);
}
[ScriptableMember]
public string GetDescription()
{
return "This is my Silverlight Description";
}
}
}
כמו כן בדף ה- Html ניתן ID, ל- Silverlight object לצורך נוחות.
לדוגמא:
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%" id="SilverlightControl">
נפרוס את האפליקציה תחת ספריית ה- ISV של CRM , כך:

ב- CRM נבצע Customization ל- Contact, נוסיף IFrame לדף ה- Html שיצרנו.

ונחבר ל- OnChange של אחד השדות את הקוד הבא:

והתוצאה הינה בשינוי שדה, קבלת ערך מתוך אפליקציית ה- Silverlight

טריק נוסף הוא להוסיף את השורה הבאה ב- Form OnLoad בכדי להסתיר את ה- IFrame
crmForm.all.IFRAME_SL.parentElement.parentElement.style.height = '0px';
וזהו, הראתי דוגמא קטנה לחיבור בין Dynamics CRM ל- Silverlight, וכעת אתם יכולים להשתמש בדמיון לשימושים השונים.
כמה רעיונות: ביצוע validations , תלות בין שדות, קריאה לשירותי WCF ועוד עוד.