<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>C# on MemoryLeak</title><link>https://blog.memoryleak.ovh/tags/c%23/</link><description>Recent content in C# on MemoryLeak</description><generator>Hugo</generator><language>fr</language><lastBuildDate>Mon, 16 Jul 2018 21:24:55 +0000</lastBuildDate><atom:link href="https://blog.memoryleak.ovh/tags/c%23/index.xml" rel="self" type="application/rss+xml"/><item><title>Migrations EF Core depuis Octopus</title><link>https://blog.memoryleak.ovh/posts/migrations-ef-core-depuis-octopus/</link><pubDate>Mon, 16 Jul 2018 21:24:55 +0000</pubDate><guid>https://blog.memoryleak.ovh/posts/migrations-ef-core-depuis-octopus/</guid><description>&lt;p&gt;Ca vous est déjà arrivé de déployer en prod une nouvelle version de votre application et d&amp;rsquo;oublier de passer la migration &lt;a href="https://docs.microsoft.com/en-us/ef/#pivot=efcore" target="_blank"&gt;EF&lt;/a&gt; à la mano ? Eh ben moi aussi. On se retrouve alors à executer le script sql de migration en urgence, en espérant que tout se passera bien. Bref, c&amp;rsquo;est la panique à bord!&lt;/p&gt;
&lt;p&gt;Histoire de ne plus revivre cette situation inconfortable, on est tenté d&amp;rsquo;avoir recours à la migration EF par le code. Ainsi, on est certains qu&amp;rsquo;a chaque exécution de notre app, la migration sera effectuée si le schéma de la BDD n&amp;rsquo;est pas à jour. Le problème, c&amp;rsquo;est que si la migration se passe mal, on se retrouve à nouveau avec une application plantée en production → retour à la case départ.&lt;/p&gt;</description></item><item><title>Blazor : Injectez vos interop Javascript</title><link>https://blog.memoryleak.ovh/posts/blazor-injectez-vos-interop-js/</link><pubDate>Fri, 20 Apr 2018 12:40:03 +0000</pubDate><guid>https://blog.memoryleak.ovh/posts/blazor-injectez-vos-interop-js/</guid><description>&lt;p&gt;Commençons par ce qui fait mal. Je dois avouer que ce blog post fait suite à un fail.&lt;/p&gt;
&lt;p&gt;Dans cette &lt;a href="https://blogs.msdn.microsoft.com/webdev/2018/04/17/blazor-0-2-0-release-now-available/" target="_blank"&gt;version 0.2&lt;/a&gt; de Blazor, il y a pas mal de code glue à produire pour pouvoir appeler une fonction javascript à partir de votre code C#.&lt;/p&gt;
&lt;p&gt;Cela se passe en 2 étapes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A partir de votre code javascript, il faut enregistrer une fonction dans le contexte de Blazor.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Blazor.registerFunction(&amp;#39;DisplayAlert&amp;#39;, (data) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; alert(data);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; return true;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Quand vous souhaitez faire appel à cette fonction on utilisera alors un code de ce type, cette fois ci dans votre code C#.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RegisteredFunction.Invoke(&amp;#34;DisplayAlert&amp;#34;, text);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On remarque que tout ca fonctionne à base de magic strings (le nom de la methode), que les functions sont obligées de retourner une valeur (void n&amp;rsquo;est pas prit en compte pour l&amp;rsquo;instant), et puis ce RegisteredFunction.Invoke c&amp;rsquo;est vraiment pas super sexy.&lt;/p&gt;</description></item><item><title>Astuce Blazor : Séparer la vue du code</title><link>https://blog.memoryleak.ovh/posts/astuce-blazor/</link><pubDate>Wed, 11 Apr 2018 21:17:03 +0000</pubDate><guid>https://blog.memoryleak.ovh/posts/astuce-blazor/</guid><description>&lt;p&gt;Depuis quelque temps dans la communauté .NET on parle fait pas mal de marketing autour de &lt;a href="https://visualstudiomagazine.com/articles/2018/03/23/blazor-alpha.aspx" target="_blank"&gt;Blazor&lt;/a&gt;. Je ne vais pas vous présenter cette nouvelle techno&amp;hellip; si vous etes ici, c&amp;rsquo;est que vous connaissez déjà :).&lt;/p&gt;
&lt;p&gt;Une des premières choses qui m&amp;rsquo;a embété fut de voir dans les articles de présentation un mélange sans vergogne du code html et du code .NET wrappé dans la section @functions&lt;/p&gt;
&lt;p&gt;je parle de ca :&lt;/p&gt;</description></item><item><title>Combiner des Expressions Trees</title><link>https://blog.memoryleak.ovh/posts/combiner-des-expressions-trees/</link><pubDate>Tue, 03 Apr 2018 21:43:43 +0000</pubDate><guid>https://blog.memoryleak.ovh/posts/combiner-des-expressions-trees/</guid><description>&lt;p&gt;Il y a tout juste quelques jours, on pair programmait avec &lt;a href="https://fr.linkedin.com/in/hocquet" target="_blank"&gt;Anthony&lt;/a&gt; sur un projet. Nous nous sommes retrouvés a vouloir combiner au runtime des &lt;a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/expression-trees/" target="_blank"&gt;Expressions trees&lt;/a&gt; en fonction de parametres évalués au runtime.&lt;/p&gt;
&lt;p&gt;En gros on avait envie d&amp;rsquo;écrire un truc du genre&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Expression predicate = x =&amp;gt; x.Id &amp;gt; 1;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;puis un peu plus loin&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;predicate += x =&amp;gt; x.Name.Length sexy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Pour faire plaisir à [maitre Etienne](https://twitter.com/EjDel?lang=fr) on va travailler a base de tests unitaires.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Commençons par la version naïve; En cherchant un peu sur la msdn on tombera facilement sur [Expression.AndAlso](https://msdn.microsoft.com/fr-fr/library/bb382914(v=vs.110).aspx) permettant de créer une nouvelle expression qui combine deux Expressions left et right
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt; [Fact]
 public void SimpleCombining_Fails()
 {
 // Arrange
 Expression firstPredicate = x =&amp;gt; x.Id &amp;gt; 1;
 Expression secondPredicate = x =&amp;gt; x.Name.Length lambda = Expression.Lambda(binaryexp, parameters);
 
 // Act
 Action filter = () =&amp;gt; {
 var combinedPredicate = lambda.Compile();
 var result = _persons.Where(combinedPredicate);
 };

 // Assert
 Assert.Throws(() =&amp;gt; filter());
 }
&lt;/code&gt;&lt;/pre&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;On commence par définir nos deux prédicats (left &amp;amp; right) que l&amp;#39;on combine dans une expression binaire AndAlso (et logique) en utilisant comme paramètre générique T le paramètre utilisé dans la premiere expression initiale.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;On essaye par la suite d&amp;#39;utiliser la lambda créée pour l&amp;#39;occasion dans une instruction [Where](https://msdn.microsoft.com/fr-fr/library/bb549418(v=vs.110).aspx) que vous connaissez tous en Linq.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Bon, j&amp;#39;avais déjà vendu la méche en disant que c&amp;#39;était une version naïve; effectivement a l&amp;#39;execution vous allez avoir une [InvalidOperationException](https://msdn.microsoft.com/fr-fr/library/system.invalidoperationexception(v=vs.110).aspx)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;System.InvalidOperationException: &amp;lsquo;variable &amp;lsquo;x&amp;rsquo; of type &amp;lsquo;AndOrExpressions.Person&amp;rsquo; referenced from scope &amp;lsquo;&amp;rsquo;, but it is not defined&amp;rsquo;&lt;/p&gt;</description></item><item><title>Comment invoquer une méthode dont on connait le nom à l’exécution sur un dynamic?</title><link>https://blog.memoryleak.ovh/posts/comment-invoquer-une-methode-dont-on-connait-le-nom-a-l-execution-sur-un-dynamic/</link><pubDate>Fri, 24 Jul 2015 12:51:00 +0000</pubDate><guid>https://blog.memoryleak.ovh/posts/comment-invoquer-une-methode-dont-on-connait-le-nom-a-l-execution-sur-un-dynamic/</guid><description>&lt;p&gt;Comment invoquer une méthode dont on connait le nom à l&amp;rsquo;exécution sur un dynamic?&lt;/p&gt;
&lt;p&gt;Le mot clé dynamic en C# n&amp;rsquo;est pas nouveau, il a vu le jour avec C# 4 et pourtant il n’apparaît pas si souvent que ça dans les bouts de code que je fréquente.&lt;/p&gt;
&lt;p&gt;Dernièrement je l&amp;rsquo;ai recroisé en utilisant &lt;a href="http://signalr.net/" target="_blank"&gt;SignalR&lt;/a&gt;; les hubs qui sont générés sont des objets dynamic.&lt;/p&gt;
&lt;p&gt;Quoi qu&amp;rsquo;il en soit, dernièrement j&amp;rsquo;ai eu besoin d&amp;rsquo;invoquer une méthode dont le nom ne m&amp;rsquo;était connu qu&amp;rsquo;à l&amp;rsquo;exécution.&lt;/p&gt;</description></item></channel></rss>