<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4034800113383693448</id><updated>2011-08-05T04:17:50.727-04:00</updated><title type='text'>Dany Laporte</title><subtitle type='html'>&amp;lt;Programming Art/&amp;gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://danylaporte.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://danylaporte.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dany Laporte</name><uri>http://www.blogger.com/profile/04124273746808175728</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4034800113383693448.post-563077877054845273</id><published>2010-01-02T10:48:00.001-05:00</published><updated>2010-01-02T10:48:31.791-05:00</updated><title type='text'>Client Databases for Silverlight</title><content type='html'>&lt;p&gt;When comes the time to use Silverlight out of browser functionality, we may have to face the fact that Silverlight might be used without an internet connection. In this particular case, the application must implement a local cache.&lt;/p&gt;  &lt;p&gt;I have found some very interesting database solution available for Silverlight.&lt;/p&gt;  &lt;h4&gt;&lt;a href="http://siaqodb.com/"&gt;siaqodb&lt;/a&gt; (in beta when this post was published)&lt;/h4&gt;  &lt;p&gt;This database is using LINQ natively to retrieve the data which is stored in the isolated storage on the client machine. &lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;var p = new Product { Name = &amp;quot;Pencil&amp;quot;, Price = 0.25 }; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;db.StoreObject(product); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;var query = from Product p in db      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where p.Name == &amp;quot;Pencil&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select p;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://siaqodb.com/" href="http://siaqodb.com/"&gt;http://siaqodb.com/&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;&lt;a href="http://silverdb.codeplex.com/"&gt;Silverlight Database&lt;/a&gt; (in beta when this post was published)&lt;/h4&gt;  &lt;p&gt;Again, this database is using the isolated storage to persist locally the offline data.&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;font face="Consolas"&gt;var &lt;/font&gt;db = Database.CreateDatabase(&amp;quot;test&amp;quot;);       &lt;br /&gt;db.CreateTable&amp;lt;Person&amp;gt;(); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;var person = new Person{ FirstName = &amp;quot;John&amp;quot;, LastName = &amp;quot;Doe&amp;quot; };      &lt;br /&gt;db.Table&amp;lt;Person&amp;gt;().Add(person); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;var q = from p in db.Table&amp;lt;Person&amp;gt;()      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where p.LastName == &amp;quot;Doe&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select p;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="http://silverdb.codeplex.com/" href="http://silverdb.codeplex.com/"&gt;http://silverdb.codeplex.com/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h4&gt;Others&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://www.db4o.com/"&gt;db4o&lt;/a&gt; : They are working on a Silverlight port.     &lt;br /&gt;&lt;a href="http://effiprozsl.codeplex.com/"&gt;EffiProzSL&lt;/a&gt; : A port of the EffiProz database.     &lt;br /&gt;&lt;a href="http://www.mcobject.com/perst"&gt;Perst&lt;/a&gt; : A port from Java.&lt;/p&gt;  &lt;h4&gt;Experimentations&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://nerddawg.blogspot.com/2007/06/google-gears-and-silverlight.html"&gt;Google gears and silverlight&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://www.itwriting.com/blog/1695-proof-of-concept-c-sqlite-running-in-silverlight.html"&gt;C#-SQLite running in Silverlight&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Happy new year!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4034800113383693448-563077877054845273?l=danylaporte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danylaporte.blogspot.com/feeds/563077877054845273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4034800113383693448&amp;postID=563077877054845273' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/563077877054845273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/563077877054845273'/><link rel='alternate' type='text/html' href='http://danylaporte.blogspot.com/2010/01/client-databases-for-silverlight.html' title='Client Databases for Silverlight'/><author><name>Dany Laporte</name><uri>http://www.blogger.com/profile/04124273746808175728</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4034800113383693448.post-4633140605841540198</id><published>2009-12-29T16:09:00.001-05:00</published><updated>2010-01-02T20:04:27.981-05:00</updated><title type='text'>WCF RIA Services without code using a TriggerAction</title><content type='html'>&lt;p&gt;When you drop a WCF RIA service data source in the visual studio 2010 Beta 2, you will see that it generates for you a load button and assign it an event handler that call Load on the ria data source.&lt;/p&gt;  &lt;p&gt;I don’t know for you but I find easier to use a TriggerAction than having to write the same code again and again.&lt;/p&gt;  &lt;p&gt;In this post, I will discuss some TriggerAction that I have implemented and helps me write RIA application faster.&lt;/p&gt;  &lt;h4&gt;LoadAction&lt;/h4&gt;  &lt;p&gt;Loading data using a data source in RIA services is very simple. You only have to call Load. Why not ease that by making it available in Microsoft Expression Blend 3 using a TriggerAction.&lt;/p&gt;  &lt;p&gt;Here is the implementation of the LoadAction that targets a DomainDataSource.&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;public class LoadAction : TargetedTriggerAction&amp;lt;DomainDataSource&amp;gt;      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; protected override void Invoke(object parameter)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var target = Target;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (target != null &amp;amp;&amp;amp; !target.IsLoadingData)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; target.Load();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;Wow! That was easy. 3 lines of code and we have our first action. Have a try in Blend and you will see that it really helps.&lt;/p&gt;  &lt;h4&gt;SubmitChangesAction&lt;/h4&gt;  &lt;p&gt;Submit data is also very simple. Here is how to do it using a TriggerAction:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;public class SubmitChangesAction : TargetedTriggerAction&amp;lt;DomainDataSource&amp;gt;     &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; protected override void Invoke(object parameter)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var target = Target;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (target != null)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; target.SubmitChanges();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;h4&gt;NavigateAction&lt;/h4&gt;  &lt;p&gt;Ok, this one is a bit harder to implement but will helps you. To navigate in Silverlight, we need an instance of the NavigationService and call the Navigate method. Again, this can be simplified.&lt;/p&gt;  &lt;p&gt;Create a TriggerAction to be attached to the Page since this is where we can have an instance of the NavigationService. We will add a property called PageUri which is the page to navigate to when the action is called:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;public class NavigateAction : TriggerAction&amp;lt;Page&amp;gt;      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160; #region PageUri DependencyProperty       &lt;br /&gt;&amp;#160;&amp;#160; public string PageUri       &lt;br /&gt;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return (string)GetValue(PageUriProperty); }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set { SetValue(PageUriProperty, value); }       &lt;br /&gt;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160; public static readonly DependencyProperty PageUriProperty = DependencyProperty.Register      &lt;br /&gt;&amp;#160;&amp;#160; (       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;PageUri&amp;quot;,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; typeof(string),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; typeof(NavigateAction),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new PropertyMetadata(null)       &lt;br /&gt;&amp;#160;&amp;#160; );       &lt;br /&gt;} &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;protected override void Invoke(object parameter)      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160; var pageUri = PageUri; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160; if (string.IsNullOrEmtpy(pageUri))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160; var page = AssociatedObject;      &lt;br /&gt;&amp;#160;&amp;#160; var uri = new Uri(pageUri, UriKind.RelativeOrAbsolute);       &lt;br /&gt;&amp;#160;&amp;#160; var service = page.NavigationService; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160; if (service != null)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; service.Navigate(uri);       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;h4&gt;NavigateAction with QueryString parameters&lt;/h4&gt;  &lt;p&gt;Good, we have a working NavigateAction. I think we can do much better. How about support for passing parameters in the query string. Here is the new implementation:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;[ContentProperty(&amp;quot;Parameters&amp;quot;)]      &lt;br /&gt;public sealed class NavigateAction : TriggerAction&amp;lt;Page&amp;gt;       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160; public NavigateAction()       &lt;br /&gt;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Parameters = new ObservableCollection&amp;lt;NavigateActionParameter&amp;gt;();       &lt;br /&gt;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160; #region Methods      &lt;br /&gt;&amp;#160;&amp;#160; private Uri CreateUri()       &lt;br /&gt;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var s = PageUri; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (string.IsNullOrEmpty(s))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return null; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var c = s.Contains(&amp;quot;?&amp;quot;) ? '&amp;amp;' : '?'; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (var i = 0; i &amp;lt; Parameters.Count; i++)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var parameter = Parameters[i];       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (parameter == null)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; continue; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var value = parameter.Value;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (value == null)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; continue; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; s += c + parameter.ParameterName + '=' + Uri.EscapeDataString(value);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; c = '&amp;amp;';       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return new Uri(s, UriKind.RelativeOrAbsolute);      &lt;br /&gt;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160; protected override void Invoke(object parameter)      &lt;br /&gt;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var page = AssociatedObject;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var uri = CreateUri();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var service = page.NavigationService; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (uri != null &amp;amp;&amp;amp; service != null)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; service.Navigate(uri);       &lt;br /&gt;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160; #endregion &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160; #region Properties      &lt;br /&gt;&amp;#160;&amp;#160; #region PageUri DependencyProperty       &lt;br /&gt;&amp;#160;&amp;#160; public string PageUri       &lt;br /&gt;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return (string)GetValue(PageUriProperty); }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set { SetValue(PageUriProperty, value); }       &lt;br /&gt;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160; public static readonly DependencyProperty PageUriProperty = DependencyProperty.Register      &lt;br /&gt;&amp;#160;&amp;#160; (       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;PageUri&amp;quot;,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; typeof(string),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; typeof(NavigateAction),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new PropertyMetadata(null)       &lt;br /&gt;&amp;#160;&amp;#160; );       &lt;br /&gt;&amp;#160;&amp;#160; #endregion       &lt;br /&gt;&amp;#160;&amp;#160; public ObservableCollection&amp;lt;NavigateActionParameter&amp;gt; Parameters { get; private set; }       &lt;br /&gt;&amp;#160;&amp;#160; #endregion       &lt;br /&gt;} &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;public sealed class NavigateActionParameter : DependencyObject      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160; #region Properties       &lt;br /&gt;&amp;#160;&amp;#160; public string ParameterName { get; set; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160; #region Value DependencyProperty      &lt;br /&gt;&amp;#160;&amp;#160; public string Value       &lt;br /&gt;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return (string)GetValue(ValueProperty); }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set { SetValue(ValueProperty, value); }       &lt;br /&gt;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160; public static readonly DependencyProperty ValueProperty = DependencyProperty.Register      &lt;br /&gt;&amp;#160;&amp;#160; (       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Value&amp;quot;,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; typeof(string),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; typeof(NavigateActionParameter),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new PropertyMetadata(null)       &lt;br /&gt;&amp;#160;&amp;#160; );       &lt;br /&gt;&amp;#160;&amp;#160; #endregion       &lt;br /&gt;&amp;#160;&amp;#160; #endregion       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;You can now use the NavigateAction and add parameters in the Query String in Blend without using code. Here is a sample&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;lt;l:NavigateAction PageUri=&amp;quot;/BacklogItemView?Action=Update&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160; &amp;lt;l:NavigateActionParameter ParameterName=&amp;quot;Id&amp;quot; Value=&amp;quot;{Binding Path=SelectedItem.Id, ElementName=dataGrid1}&amp;quot;/&amp;gt;       &lt;br /&gt;&amp;lt;/l:NavigateAction&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This will pass a parameter named Id in the Query String.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Happy programming!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4034800113383693448-4633140605841540198?l=danylaporte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danylaporte.blogspot.com/feeds/4633140605841540198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4034800113383693448&amp;postID=4633140605841540198' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/4633140605841540198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/4633140605841540198'/><link rel='alternate' type='text/html' href='http://danylaporte.blogspot.com/2009/12/wcf-ria-services-without-code-with.html' title='WCF RIA Services without code using a TriggerAction'/><author><name>Dany Laporte</name><uri>http://www.blogger.com/profile/04124273746808175728</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4034800113383693448.post-3672379914208781221</id><published>2009-12-29T15:27:00.001-05:00</published><updated>2010-01-02T12:58:14.975-05:00</updated><title type='text'>Combining Command and TriggerAction In Silverlight</title><content type='html'>&lt;p&gt;Since Blend 3, we can create a TriggerAction to implement various redundant things. Even redundant business logic can be implemented as TriggerAction.&lt;/p&gt;  &lt;p&gt;Commands on the other side is great way to notify controls that an action can be executed. A command can also be used on more than one control.&lt;/p&gt;  &lt;p&gt;In this post, I will discuss a way to create command and bind it to an action so the action is invoked when a command is executed. After that, you will be able to use Blend 3 to create a command in resources and bind it to an action.&lt;/p&gt;  &lt;h4&gt;A reusable command&lt;/h4&gt;  &lt;p&gt;We will start by implementing a command that have an event Executing. This event is going to occur when the method Execute is called.&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;public class EventCommand : DependencyObject, ICommand      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; #region Methods       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public bool CanExecute(object parameter)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return true;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160; public void Execute(object parameter)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Executing != null)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Executing(parameter);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; #endregion &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160; #region Events      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public event EventHandler CanExecuteChanged;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public event ExecuteEventHandler Executing;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; #endregion       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;public delegate void ExecuteEventHandler(object parameter);&lt;/font&gt;&lt;/p&gt;  &lt;h4&gt;A Trigger to invoke the action&lt;/h4&gt;  &lt;p&gt;We need a class that will handle the executing event of the EventCommand and fire the action. We call this class a CommandTrigger. Here is the implementation of this trigger:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;public class CommandTrigger : TriggerBase&amp;lt;DependencyObject&amp;gt;      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; #region Methods       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; private void HandleCommandExecuting(object parameter)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InvokeActions(parameter);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; #endregion &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160; #region Properties      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; #region Command DependencyProperty       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public EventCommand Command       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return (EventCommand)GetValue(CommandProperty); }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set { SetValue(CommandProperty, value); }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160; public static readonly DependencyProperty CommandProperty = DependencyProperty.Register      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Command&amp;quot;,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; typeof(EventCommand),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; typeof(CommandTrigger),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; new PropertyMetadata(OnCommandChanged)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ); &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160; private static void OnCommandChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var trigger = (CommandTrigger)o;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var oldValue = (EventCommand)e.OldValue;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var newValue = (EventCommand)e.NewValue; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (oldValue != null)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; oldValue.Executing -= trigger.HandleCommandExecuting; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (newValue != null)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; newValue.Executing += trigger.HandleCommandExecuting;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; #endregion       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; #endregion       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Advantages of this technique:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Having a trigger separate the action from the invoker. The action can now be invoked when the control is loaded, on a timer. &lt;/li&gt;    &lt;li&gt;Having a command helps reuse the same instance of the action and invoke it from anywhere. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Disavantages of this techinique:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;I did not find a good way of setting the CanExecute property of the command. &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;Usage&lt;/h4&gt;  &lt;p&gt;Image you want to remove an element when the user click a button, you can now do it like that:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;lt;Grid&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160; &amp;lt;Grid.Resources&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;local:EventCommand x:Key=&amp;quot;RemoveElementCommand&amp;quot;/&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160; &amp;lt;/Grid.Resources&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160; &amp;lt;Button Command=&amp;quot;{StaticResource RemoveElementCommand}&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Content=&amp;quot;Remove Element&amp;quot; /&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&amp;#160;&amp;#160; &amp;lt;ContentControl&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;i:Interaction.Triggers&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;local:CommandTrigger Command=&amp;quot;{StaticResource RemoveElementCommand}&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;mi:RemoveElementAction/&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/local:CommandTrigger&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/i:Interaction.Triggers&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160; &amp;lt;/ContentControl&amp;gt;       &lt;br /&gt;      &lt;br /&gt;&amp;lt;/Grid&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Happy programming!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4034800113383693448-3672379914208781221?l=danylaporte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danylaporte.blogspot.com/feeds/3672379914208781221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4034800113383693448&amp;postID=3672379914208781221' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/3672379914208781221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/3672379914208781221'/><link rel='alternate' type='text/html' href='http://danylaporte.blogspot.com/2009/12/combining-command-and-triggeraction-in.html' title='Combining Command and TriggerAction In Silverlight'/><author><name>Dany Laporte</name><uri>http://www.blogger.com/profile/04124273746808175728</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4034800113383693448.post-464795058318074064</id><published>2008-09-25T11:20:00.002-04:00</published><updated>2008-09-25T11:26:03.127-04:00</updated><title type='text'>Guidelines for working with ADO.Net Entity Framework</title><content type='html'>&lt;p&gt;I would like to share with you some Guidelines for working with ADO.Net Entity Framework and other Linq flavored Framework.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;We should enable all the integrity from the database. The validation of the integrity is not provided by the framework. It will be more effective if the database can return the index or the foreign key that is failing. I will need to do some test on this.&lt;/li&gt;&lt;li&gt;Don’t add instance properties or methods to the entities. Entities are not like business objects, they are only data container. Also, using instance properties inside entity reduce the easiness to write queries using the linq syntax.&lt;br /&gt;&lt;br /&gt;Ex: Supposed you’ve add the property MyProperty by code to the entity Employee. Now, supposed someone want to query the employee with your property:&lt;br /&gt;&lt;br /&gt;var q = from e in db.Employees&lt;br /&gt;              where e.MyProperty != null&lt;br /&gt;              select e;&lt;br /&gt;&lt;br /&gt;This will throw an exception at runtime because MyProperty cannot be translated to SQL.&lt;/li&gt;&lt;li&gt;Consider not putting validation into the model.&lt;/li&gt;&lt;li&gt;Don’t put UI stuff in the model. It may seems evident but ...&lt;/li&gt;&lt;li&gt;Use an interface over your model. Consider design for testability.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I will probably add more in the future.&lt;br /&gt;&lt;br /&gt;Stay tune!&lt;/p&gt;&lt;p&gt;Dany&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4034800113383693448-464795058318074064?l=danylaporte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danylaporte.blogspot.com/feeds/464795058318074064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4034800113383693448&amp;postID=464795058318074064' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/464795058318074064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/464795058318074064'/><link rel='alternate' type='text/html' href='http://danylaporte.blogspot.com/2008/09/guidelines-for-working-with-adonet.html' title='Guidelines for working with ADO.Net Entity Framework'/><author><name>Dany Laporte</name><uri>http://www.blogger.com/profile/04124273746808175728</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4034800113383693448.post-7098131572500089171</id><published>2008-09-24T21:49:00.001-04:00</published><updated>2008-09-24T21:49:22.289-04:00</updated><title type='text'>WeakEventHandler</title><content type='html'>&lt;p&gt;I came across a problem this week. I was needing a weak delegate to handle a situation where I have a ListBox and I want it to listen to a property changed on a selected ListBoxItem. This situation need to have a weak delegate because if the ListBoxItem is kept referenced, I want to let the ListBox to be garbage collected.    &lt;br /&gt;    &lt;br /&gt;This is how I have implemented the WeakEventHandler. I thought it was a good implementation because it also supports the anonymous methods even if they are closure. &lt;/p&gt;  &lt;h3&gt;WeakEventHandler&lt;/h3&gt;  &lt;p&gt;&lt;span style="color: blue"&gt;&lt;font color="#333333"&gt;The WeakEventHandler is a thin class inheriting the WeakHandler&amp;lt;T&amp;gt; and provinding a closure delegate in the CreateHandler.&lt;/font&gt;&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;&lt;span style="color: blue"&gt;public sealed class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WeakEventHandler &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;WeakHandler&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;&amp;gt;     &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public &lt;/span&gt;WeakEventHandler(&lt;span style="color: #2b91af"&gt;EventHandler &lt;/span&gt;handler)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color: blue"&gt;base&lt;/span&gt;(handler)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected override &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EventHandler &lt;/span&gt;CreateHandler(&lt;span style="color: #2b91af"&gt;WeakReference &lt;/span&gt;weakReference)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return &lt;/span&gt;(sender, e) =&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var &lt;/span&gt;h = (&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;)weakReference.Target;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if &lt;/span&gt;(h != &lt;span style="color: blue"&gt;null&lt;/span&gt;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; h(sender, e);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;} &lt;/p&gt;  &lt;h3&gt;The WeakHandler base class   &lt;br /&gt;&lt;span style="color: blue"&gt;&lt;font color="#333333"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/h3&gt;  &lt;p&gt;&lt;span style="color: blue"&gt;&lt;font color="#333333"&gt;The WeakHandler is the based class for all delegate type. It provide automatic translation to a weak delegate build by the CreateHandler.&lt;/font&gt;&lt;/span&gt; &lt;/p&gt;  &lt;p&gt;&lt;span style="color: blue"&gt;&amp;#160;&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: blue"&gt;public abstract class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WeakHandler&lt;/span&gt;&amp;lt;T&amp;gt; &lt;span style="color: blue"&gt;where &lt;/span&gt;T : &lt;span style="color: blue"&gt;class      &lt;br /&gt;&lt;/span&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private &lt;/span&gt;T handler;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private &lt;/span&gt;T implicitHandler;     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected &lt;/span&gt;WeakHandler(T handler)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if &lt;/span&gt;(handler == &lt;span style="color: blue"&gt;null&lt;/span&gt;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;handler&amp;quot;&lt;/span&gt;);     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if &lt;/span&gt;(!(handler &lt;span style="color: blue"&gt;is &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Delegate&lt;/span&gt;))     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;InvalidOperationException&lt;/span&gt;();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.handler = handler;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected abstract &lt;/span&gt;T CreateHandler(&lt;span style="color: #2b91af"&gt;WeakReference &lt;/span&gt;weakReference);     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public static implicit operator &lt;/span&gt;T(&lt;span style="color: #2b91af"&gt;WeakHandler&lt;/span&gt;&amp;lt;T&amp;gt; weakHandler)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if &lt;/span&gt;(weakHandler == &lt;span style="color: blue"&gt;null&lt;/span&gt;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return null&lt;/span&gt;;     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if &lt;/span&gt;(weakHandler.implicitHandler == &lt;span style="color: blue"&gt;null&lt;/span&gt;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;lock &lt;/span&gt;(weakHandler.handler)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if &lt;/span&gt;(weakHandler.implicitHandler == &lt;span style="color: blue"&gt;null&lt;/span&gt;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var &lt;/span&gt;ih = weakHandler.CreateHandler(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WeakReference&lt;/span&gt;(weakHandler.handler));     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;.MemoryBarrier();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; weakHandler.implicitHandler = ih;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return &lt;/span&gt;weakHandler.implicitHandler;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;}&lt;/p&gt; &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;How to use it&lt;/h3&gt;  &lt;p&gt;You can use the WeakEventHandler simply as if you where the EventHandler provided by the framework:&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;span style="color: #2b91af"&gt;Form &lt;/span&gt;f = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Form&lt;/span&gt;();     &lt;br /&gt;f.SizeChanged += &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;WeakEventHandler&lt;/span&gt;(&lt;span style="color: blue"&gt;delegate&lt;/span&gt;(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;&amp;quot;Form changed.&amp;quot;&lt;/span&gt;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; });&lt;/p&gt; &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Where are we?&lt;/h3&gt;  &lt;p&gt;We saw how to implement and reuse weak event handler. This event is very easy to create and reuse.&lt;/p&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;p&gt;Happy Programming!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4034800113383693448-7098131572500089171?l=danylaporte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danylaporte.blogspot.com/feeds/7098131572500089171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4034800113383693448&amp;postID=7098131572500089171' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/7098131572500089171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/7098131572500089171'/><link rel='alternate' type='text/html' href='http://danylaporte.blogspot.com/2008/09/weakeventhandler.html' title='WeakEventHandler'/><author><name>Dany Laporte</name><uri>http://www.blogger.com/profile/04124273746808175728</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4034800113383693448.post-5614086269693226179</id><published>2008-09-24T21:03:00.002-04:00</published><updated>2008-09-24T22:00:04.910-04:00</updated><title type='text'>Testability of your Linq For Sql Model</title><content type='html'>&lt;p&gt;I have already spoke with my friends about this. I think it’s the time to post it in my blog. Here is how I shield my implementation from the model.&lt;/p&gt;&lt;h3&gt;Use an interface, not the class &lt;/h3&gt;&lt;p&gt;Instead of using directly the DataModel generated by the Linq For Sql designer, you could use an interface representing your model.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IDataContext&lt;br /&gt;&lt;/span&gt;{&lt;br /&gt;    &lt;span style="color:blue;"&gt;void &lt;/span&gt;SaveChanges();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEmployeeModel &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;IDataContext&lt;br /&gt;&lt;/span&gt;{&lt;br /&gt;    &lt;span style="color:blue;"&gt;void &lt;/span&gt;AddEmployee(&lt;span style="color:#2b91af;"&gt;Employee &lt;/span&gt;employee);&lt;br /&gt;    &lt;span style="color:blue;"&gt;void &lt;/span&gt;DeleteEmployee(&lt;span style="color:#2b91af;"&gt;Employee &lt;/span&gt;employee);&lt;br /&gt;    &lt;span style="color:#2b91af;"&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Employee&lt;/span&gt;&amp;gt; Employees { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;We can see here that we have an interface that represent our model.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Customizing the generated partial class&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;The model generated by the Linq For Sql Designer is using a partial class. Using this feature, we can support for our IEmployeeModel interface. Here is how we do this:&lt;br /&gt;&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;partial class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;DataClasses1DataContext &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;IEmployeeModel&lt;br /&gt;&lt;/span&gt;{&lt;br /&gt;    &lt;span style="color:blue;"&gt;#region &lt;/span&gt;IEmployeeModel Members&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;public void &lt;/span&gt;AddEmployee(&lt;span style="color:#2b91af;"&gt;Employee &lt;/span&gt;employee)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(employee == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color:blue;"&gt;throw new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;"employee"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:blue;"&gt;this&lt;/span&gt;.Employees.InsertOnSubmit(employee);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;void &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEmployeeModel&lt;/span&gt;.DeleteEmployee(&lt;span style="color:#2b91af;"&gt;Employee &lt;/span&gt;employee)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(employee == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color:blue;"&gt;throw new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;"employee"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:blue;"&gt;this&lt;/span&gt;.Employees.DeleteOnSubmit(employee);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#2b91af;"&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Employee&lt;/span&gt;&amp;gt; &lt;span style="color:#2b91af;"&gt;IEmployeeModel&lt;/span&gt;.Employees&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return this&lt;/span&gt;.Employees; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;#endregion&lt;br /&gt;&lt;br /&gt;    #region &lt;/span&gt;IDataContext Members&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;public void &lt;/span&gt;SaveChanges()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:blue;"&gt;this&lt;/span&gt;.SubmitChanges();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;#endregion&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Implement a MockEmployeeModel class&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;After doing our real model, we can create a mock of our model to simulate database for very specific cases without touching the database. This way, we will be able to test even our Linq queries.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MockEmployeeModel &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;IEmployeeModel&lt;br /&gt;&lt;/span&gt;{&lt;br /&gt;    &lt;span style="color:blue;"&gt;private &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Employee&lt;/span&gt;&amp;gt; employees;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;public &lt;/span&gt;MockEmployeeModel()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:blue;"&gt;this&lt;/span&gt;.employees = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Employee&lt;/span&gt;&amp;gt;();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;#region &lt;/span&gt;IEmployeeModel Members&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;public void &lt;/span&gt;AddEmployee(&lt;span style="color:#2b91af;"&gt;Employee &lt;/span&gt;employee)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(employee == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color:blue;"&gt;throw new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;"employee"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:blue;"&gt;this&lt;/span&gt;.employees.Add(employee);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;public void &lt;/span&gt;DeleteEmployee(&lt;span style="color:#2b91af;"&gt;Employee &lt;/span&gt;employee)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(employee == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color:blue;"&gt;throw new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;"employee"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:blue;"&gt;this&lt;/span&gt;.employees.Remove(employee);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IQueryable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Employee&lt;/span&gt;&amp;gt; Employees&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return this&lt;/span&gt;.employees.AsQueryable(); }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;#endregion&lt;br /&gt;&lt;br /&gt;    #region &lt;/span&gt;IDataContext Members&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;public void &lt;/span&gt;SaveChanges()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:green;"&gt;// Nothing special to do here.&lt;br /&gt;    &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;#endregion&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;h3&gt;Limitations&lt;/h3&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Compiled Linq queries are not supported. I will probably show you in a next post how to support it.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;The MockModel is very limited. We would probably benefit having a mocking framework here.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Conclusion&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;As a typical use, we can now use normal linq queries over our model and test our queries in the very same manner using our MockEmployeeModel. This approach works with ADO.Net Entity Framework as well.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Happy Programming!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4034800113383693448-5614086269693226179?l=danylaporte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danylaporte.blogspot.com/feeds/5614086269693226179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4034800113383693448&amp;postID=5614086269693226179' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/5614086269693226179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/5614086269693226179'/><link rel='alternate' type='text/html' href='http://danylaporte.blogspot.com/2008/09/testability-of-your-linq-for-sql-model.html' title='Testability of your Linq For Sql Model'/><author><name>Dany Laporte</name><uri>http://www.blogger.com/profile/04124273746808175728</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4034800113383693448.post-7396712088078338225</id><published>2008-07-14T22:26:00.001-04:00</published><updated>2008-07-14T22:26:11.671-04:00</updated><title type='text'>WPF: ComboBox and Null Values</title><content type='html'>&lt;p&gt;When binding a ComboBox in WPF, you don’t have access to select a null value. There is several ways to allow ComboBox to select a null value:   &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;By Code: You can create a list of items and add a null item (not a null value but and item instance representing the null value). This is not reusable.&lt;/li&gt;    &lt;li&gt;By using a Converter: This is a bit more reusable but is not the best for scenario that already needs a converter. Also, this method require a convert from and a convert back of the value.&lt;/li&gt;    &lt;li&gt;By using an Attached Property: To me, this seems the ideal way (unless it is implemented directly by the ComboBox) to manage null value and this will be the technique describe here.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Here is how to create the Attached property:   &lt;br /&gt;&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public static class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ComboUtil&lt;br /&gt;&lt;/span&gt;{&lt;br /&gt;    &lt;span style="color: blue"&gt;private static readonly &lt;/span&gt;&lt;span style="color: #2b91af"&gt;CommandBinding &lt;/span&gt;DeleteCommandBinding = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;CommandBinding&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;ApplicationCommands&lt;/span&gt;.Delete, HandleExecuteDeleteCommand);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;private static void &lt;/span&gt;HandleExecuteDeleteCommand(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;ExecutedRoutedEventArgs &lt;/span&gt;e)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: blue"&gt;var &lt;/span&gt;combo = e.Source &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ComboBox&lt;/span&gt;;&lt;br /&gt;        &lt;span style="color: blue"&gt;if &lt;/span&gt;(combo != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;            combo.SelectedIndex = -1;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;#region &lt;/span&gt;AllowNull Property&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;public static bool &lt;/span&gt;GetAllowNull(&lt;span style="color: #2b91af"&gt;ComboBox &lt;/span&gt;combo)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: blue"&gt;if &lt;/span&gt;(combo == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;combo&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: blue"&gt;return &lt;/span&gt;(&lt;span style="color: blue"&gt;bool&lt;/span&gt;)combo.GetValue(AllowNullProperty);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;public static void &lt;/span&gt;SetAllowNull(&lt;span style="color: #2b91af"&gt;ComboBox &lt;/span&gt;combo, &lt;span style="color: blue"&gt;bool &lt;/span&gt;value)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: blue"&gt;if &lt;/span&gt;(combo == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;combo&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        combo.SetValue(AllowNullProperty, value);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;public static readonly &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DependencyProperty &lt;/span&gt;AllowNullProperty =&lt;br /&gt;        &lt;span style="color: #2b91af"&gt;DependencyProperty&lt;/span&gt;.RegisterAttached(&lt;br /&gt;            &lt;span style="color: #a31515"&gt;&amp;quot;AllowNull&amp;quot;&lt;/span&gt;,&lt;br /&gt;            &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: blue"&gt;bool&lt;/span&gt;),&lt;br /&gt;            &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;ComboUtil&lt;/span&gt;),&lt;br /&gt;            &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UIPropertyMetadata&lt;/span&gt;(HandleAllowNullPropertyChanged));&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;private static void &lt;/span&gt;HandleAllowNullPropertyChanged(&lt;span style="color: #2b91af"&gt;DependencyObject &lt;/span&gt;o, &lt;span style="color: #2b91af"&gt;DependencyPropertyChangedEventArgs &lt;/span&gt;e)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: blue"&gt;var &lt;/span&gt;combo = (&lt;span style="color: #2b91af"&gt;ComboBox&lt;/span&gt;)o;&lt;br /&gt;        &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: blue"&gt;true&lt;/span&gt;.Equals(e.NewValue))&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: blue"&gt;if &lt;/span&gt;(!combo.CommandBindings.Contains(DeleteCommandBinding))&lt;br /&gt;                combo.CommandBindings.Add(DeleteCommandBinding);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: blue"&gt;else&lt;br /&gt;        &lt;/span&gt;{&lt;br /&gt;            combo.CommandBindings.Remove(DeleteCommandBinding);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;#endregion&lt;br /&gt;&lt;/span&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;By using the above code, you will now be able to create a nullable comboBox by xaml only:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ComboBox &lt;/span&gt;&lt;span style="color: red"&gt;local&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: red"&gt;ComboUtil.AllowNull&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ComboBoxItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Hello&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ComboBoxItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ComboBoxItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Hi&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ComboBoxItem&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ComboBox&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;and reset the combo by hitting the &amp;lt;DELETE&amp;gt; key when the ComboBox has the input focus.&lt;br /&gt;  &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Happy WPF programming!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Dany&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4034800113383693448-7396712088078338225?l=danylaporte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danylaporte.blogspot.com/feeds/7396712088078338225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4034800113383693448&amp;postID=7396712088078338225' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/7396712088078338225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/7396712088078338225'/><link rel='alternate' type='text/html' href='http://danylaporte.blogspot.com/2008/07/wpf-combobox-and-null-values.html' title='WPF: ComboBox and Null Values'/><author><name>Dany Laporte</name><uri>http://www.blogger.com/profile/04124273746808175728</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4034800113383693448.post-1154391866168210476</id><published>2008-06-16T16:31:00.001-04:00</published><updated>2008-06-16T16:50:26.301-04:00</updated><title type='text'>Anonymous Types and Linq Compiled Queries revisited!</title><content type='html'>&lt;p&gt;I have undertaken recently to bring a project coded with sql queries and stored procs in Linq and tried to eliminate all stored procs. The code need to be very efficient because the amount of data to be processed is huge. I came across the linq queries and found that we can compiled them in order that only the parameters can change and the query and the reading delegate are reused over and over. This is the best approach in my case because queries are not dynamic and it is very near as efficient as direct sql. What I need is create a query, and compile it using&lt;/p&gt;  &lt;p&gt;System.Data.Linq.CompiledQuery.Compile…&lt;/p&gt;  &lt;p&gt;But wait, this is not that simple. There is a problem. You can’t use a compiled query with an anonymous type! How would you store the resulting delegate func. You can’t reuse the anonymous type outside of the scope of the method.    &lt;br /&gt;    &lt;br /&gt;Really?&lt;/p&gt;  &lt;p&gt;No, we can do something about it. Here is how I resolve the issue:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Create a query holder. I have create a struct that will hold the func delegate but as an object.      &lt;br /&gt;      &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public struct &lt;/span&gt;&lt;span style="color: #2b91af"&gt;CompiledQuery&lt;br /&gt;&lt;/span&gt;{&lt;br /&gt;    &lt;span style="color: blue"&gt;private object &lt;/span&gt;query;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;Now, I have created a bunch of methods on that struct that will execute the query. This is the best because it manage automatically the lifetime of the query. &lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;TResult Execute&amp;lt;TDbContext, TResult&amp;gt;(&lt;br /&gt;    TDbContext context,&lt;br /&gt;    &lt;span style="color: #2b91af"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;TDbContext, TResult&amp;gt;&amp;gt; query) &lt;span style="color: blue"&gt;where &lt;/span&gt;TDbContext : &lt;span style="color: #2b91af"&gt;DataContext&lt;br /&gt;&lt;/span&gt;{&lt;br /&gt;    &lt;span style="color: blue"&gt;if &lt;/span&gt;(context == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;context&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;if &lt;/span&gt;(query == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;query&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;TDbContext, TResult&amp;gt; func;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;.query == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        func = System.Data.Linq.&lt;span style="color: #2b91af"&gt;CompiledQuery&lt;/span&gt;.Compile&amp;lt;TDbContext, TResult&amp;gt;(query);&lt;br /&gt;        &lt;span style="color: blue"&gt;this&lt;/span&gt;.query = func;&lt;br /&gt;    }&lt;br /&gt;    &lt;span style="color: blue"&gt;else&lt;br /&gt;        &lt;/span&gt;func = (&lt;span style="color: #2b91af"&gt;Func&lt;/span&gt;&amp;lt;TDbContext, TResult&amp;gt;)&lt;span style="color: blue"&gt;this&lt;/span&gt;.query;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;return &lt;/span&gt;func(context);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;p&gt;This works because we are using the compiler type inference to help us finding the type of the delegate and casting is as a valid as func. &lt;/p&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;&lt;br /&gt;    &lt;p&gt;After that, I can use the code to query the data directly. Really simple isn’t it? &lt;br /&gt;      &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MyClass&lt;br /&gt;&lt;/span&gt;{&lt;br /&gt;    &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;CompiledQuery &lt;/span&gt;myQuery;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: blue"&gt;public void &lt;/span&gt;MyMethod()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: blue"&gt;using &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;context = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DbDataContext&lt;/span&gt;())&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: blue"&gt;var &lt;/span&gt;items = &lt;span style="color: blue"&gt;this&lt;/span&gt;.myQuery.Execute(context,&lt;br /&gt;                c =&amp;gt;&lt;br /&gt;                    &lt;span style="color: blue"&gt;from &lt;/span&gt;e &lt;span style="color: blue"&gt;in &lt;/span&gt;c.Employees&lt;br /&gt;                    &lt;span style="color: blue"&gt;select new&lt;br /&gt;                    &lt;/span&gt;{&lt;br /&gt;                        e.FirstName,&lt;br /&gt;                        e.LastName,&lt;br /&gt;                        e.EmployeeNumber&lt;br /&gt;                    });&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: blue"&gt;var &lt;/span&gt;item &lt;span style="color: blue"&gt;in &lt;/span&gt;items)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;&amp;quot;FirstName = {0}, LastName = {1}, Number = {2}&amp;quot;&lt;/span&gt;, item.FirstName, item.LastName, item.EmployeeNumber);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;    &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;    &lt;p&gt;&lt;br /&gt;      &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;  &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Happy Linq programming! Have a nice week!&lt;br /&gt;  &lt;br /&gt;Dany&lt;/p&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4034800113383693448-1154391866168210476?l=danylaporte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danylaporte.blogspot.com/feeds/1154391866168210476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4034800113383693448&amp;postID=1154391866168210476' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/1154391866168210476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/1154391866168210476'/><link rel='alternate' type='text/html' href='http://danylaporte.blogspot.com/2008/06/anonymous-types-and-linq-compiled.html' title='Anonymous Types and Linq Compiled Queries revisited!'/><author><name>Dany Laporte</name><uri>http://www.blogger.com/profile/04124273746808175728</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4034800113383693448.post-1709426055680587996</id><published>2008-01-23T19:56:00.001-05:00</published><updated>2008-01-24T11:48:43.743-05:00</updated><title type='text'>A better context container</title><content type='html'>&lt;p&gt;Suppose you want to share some context info between multiple methods / objects. In WCF you must use OperationContext.Current to store the data. In ASP.Net, you can use the session, or better the HttpContext.Items. For Windows Forms, you will have the ThreadStatic attribute. With my new implementation of an AmbientContext, we have a single store to share the context data in all of theses scenarios.&lt;/p&gt;&lt;p&gt;I've picked the idea here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://aabs.wordpress.com/2007/12/31/the-ambient-context-design-pattern-in-net/"&gt;http://aabs.wordpress.com/2007/12/31/the-ambient-context-design-pattern-in-net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and here:&lt;/p&gt;&lt;p&gt;&lt;a title="http://msdn.microsoft.com/msdnmag/issues/06/09/NETMatters/default.aspx" href="http://msdn.microsoft.com/msdnmag/issues/06/09/NETMatters/default.aspx"&gt;http://msdn.microsoft.com/msdnmag/issues/06/09/NETMatters/default.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;OK, here is a sample code to use it:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public void &lt;/span&gt;Method1()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;AmbientContextScope&lt;/span&gt;())&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#2b91af;"&gt;AmbientContext&lt;/span&gt;.Current.SetLogicalValue(&lt;br /&gt;            &lt;span style="color:#a31515;"&gt;"userInfo"&lt;/span&gt;,&lt;br /&gt;            &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;UserInfo&lt;/span&gt;()&lt;br /&gt;            {&lt;br /&gt;                DisplayName = &lt;span style="color:#a31515;"&gt;"Dany Laporte"&lt;/span&gt;,&lt;br /&gt;                Username = &lt;span style="color:#a31515;"&gt;"danlap"&lt;br /&gt;            &lt;/span&gt;});&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:blue;"&gt;this&lt;/span&gt;.ShowUserInContext();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;public void &lt;/span&gt;ShowUserInContext()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:blue;"&gt;if &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;AmbientContext&lt;/span&gt;.Current != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#2b91af;"&gt;UserInfo &lt;/span&gt;userInfo = (&lt;span style="color:#2b91af;"&gt;UserInfo&lt;/span&gt;)&lt;span style="color:#2b91af;"&gt;AmbientContext&lt;/span&gt;.Current.GetLogicalValue(&lt;span style="color:#a31515;"&gt;"userInfo"&lt;/span&gt;);&lt;br /&gt;        &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(userInfo.DisplayName);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;With a context scope, you can copy the data upon multiple contexts or multiple threads easily. You can also create delegate that are scoped based on the current context.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;AmbientContextScope&lt;/span&gt;())&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#2b91af;"&gt;AmbientContext&lt;/span&gt;.Current.SetLogicalValue(&lt;span style="color:#a31515;"&gt;"myKey"&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;"myValue"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#2b91af;"&gt;ThreadPool&lt;/span&gt;.QueueUserWorkItem(&lt;br /&gt;&lt;span style="color:#2b91af;"&gt;AmbientContext&lt;/span&gt;.Current.CreateScopedDelegate(&lt;br /&gt;&lt;span style="color:blue;"&gt;delegate&lt;/span&gt;(&lt;span style="color:blue;"&gt;object &lt;/span&gt;state)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#2b91af;"&gt;AmbientContext&lt;/span&gt;.Current.GetLogicalValue(&lt;span style="color:#a31515;"&gt;"myKey"&lt;/span&gt;));&lt;br /&gt;}));&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;Here is a simple class diagram of the actual implementation:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.google.com/dany.laporte/R5fiIHokpeI/AAAAAAAAACE/9HxcJ6_2YBY/AmbientContextDiagram%5B12%5D"&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height="280" alt="AmbientContextDiagram" src="http://lh4.google.com/dany.laporte/R5fiJHokpfI/AAAAAAAAACM/SS-D6Qskee8/AmbientContextDiagram_thumb%5B10%5D" width="639" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Please tell me what you think?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4034800113383693448-1709426055680587996?l=danylaporte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danylaporte.blogspot.com/feeds/1709426055680587996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4034800113383693448&amp;postID=1709426055680587996' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/1709426055680587996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/1709426055680587996'/><link rel='alternate' type='text/html' href='http://danylaporte.blogspot.com/2008/01/better-context-container.html' title='A better context container'/><author><name>Dany Laporte</name><uri>http://www.blogger.com/profile/04124273746808175728</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4034800113383693448.post-8251680811868495750</id><published>2008-01-14T12:50:00.000-05:00</published><updated>2008-01-14T12:51:48.183-05:00</updated><title type='text'>Pourquoi on ne devrait pas utiliser l'héritage de classe</title><content type='html'>Voici un article intéressant décrivant une facette négative de l'héritage de classe. &lt;a title="http://www.berniecode.com/writing/inheritance/" href="http://www.berniecode.com/writing/inheritance/"&gt;http://www.berniecode.com/writing/inheritance/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4034800113383693448-8251680811868495750?l=danylaporte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danylaporte.blogspot.com/feeds/8251680811868495750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4034800113383693448&amp;postID=8251680811868495750' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/8251680811868495750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/8251680811868495750'/><link rel='alternate' type='text/html' href='http://danylaporte.blogspot.com/2008/01/pourquoi-on-ne-devrait-pas-utiliser.html' title='Pourquoi on ne devrait pas utiliser l&apos;héritage de classe'/><author><name>Dany Laporte</name><uri>http://www.blogger.com/profile/04124273746808175728</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4034800113383693448.post-4038074393586613141</id><published>2008-01-12T22:56:00.001-05:00</published><updated>2008-01-14T09:28:38.972-05:00</updated><title type='text'>C# 3.0 - Méthodes d'extensions et exceptions</title><content type='html'>&lt;p&gt; &lt;/p&gt;&lt;p&gt;Pour ceux et celles qui commencent à utiliser le C# 3.0, vous avez sans doute commencé à utiliser les méthodes d'extensions. Cette nouvelle possibilité nous permet maintenant d'étendre les classes, structures et interfaces en leur ajoutant de nouvelles méthodes.&lt;br /&gt;&lt;br /&gt;Aujourd'hui, j'aimerais utiliser les méthodes d'extensions afin de pouvoir réduire le code pour lever des exceptions. La plupart d'entre nous, lorsque nous voulons lever une exception, nous écrivons le code suivant:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Employee &lt;/span&gt;CreateEmployee(&lt;span style="color:blue;"&gt;string &lt;/span&gt;employeeNumber)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:blue;"&gt;if &lt;/span&gt;(employeeNumber == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color:blue;"&gt;throw new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;"employeeNumber"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;if &lt;/span&gt;(employeeNumber.Length == 0)&lt;br /&gt;        &lt;span style="color:blue;"&gt;throw new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ArgumentException&lt;/span&gt;(&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(Properties.Resources.ArgumentStringCannotBeEmtpy, &lt;span style="color:#a31515;"&gt;"employeeNumber"&lt;/span&gt;), &lt;span style="color:#a31515;"&gt;"employeeNumber"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:blue;"&gt;return new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Employee&lt;/span&gt;(employeeNumber);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Ce code très simple mais est souvent redondant et tellement long à écrire que certain programmeur préfère omettre ce code et ne pas lever d'exceptions.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;J'ai décidé de me pencher sur le problème et d'essayer de trouver une solution pour écrire  moins de code.  Voici la solution que je propose:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Employee &lt;/span&gt;CreateEmployee(&lt;span style="color:blue;"&gt;string &lt;/span&gt;employeeNumber)&lt;br /&gt;{&lt;br /&gt;    employeeNumber.Check(&lt;span style="color:#a31515;"&gt;"employeeNumber"&lt;/span&gt;).ThrowNull().ThrowEmpty();&lt;br /&gt;    &lt;span style="color:blue;"&gt;return new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Employee&lt;/span&gt;(employeeNumber);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;C'est beaucoup plus compact et permet de réutiliser le code qui lève les exceptions. La méthode d'extension Check est ajoutée à tous les types de classe et permet d'introduire le nom du paramètre à vérifier. Ensuite, le ThrowNull (réservé aux classes) lève un ArgumentNullException si le paramètre est null. Le ThrowEmpty (réservé aux Strings) lève le ArgumentException.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;Qu'en pensez-vous?&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;Il est possible de pousser les validations encore plus loin et d'ajouter des lambdas. J'en parlerai dans un prochain billet. A+&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;Dany.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;a href="http://11011.net/software/vspaste"&gt; &lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4034800113383693448-4038074393586613141?l=danylaporte.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://danylaporte.blogspot.com/feeds/4038074393586613141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4034800113383693448&amp;postID=4038074393586613141' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/4038074393586613141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4034800113383693448/posts/default/4038074393586613141'/><link rel='alternate' type='text/html' href='http://danylaporte.blogspot.com/2008/01/c-30-mthodes-d-et-exceptions.html' title='C# 3.0 - Méthodes d&amp;#39;extensions et exceptions'/><author><name>Dany Laporte</name><uri>http://www.blogger.com/profile/04124273746808175728</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
