<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Fabse-on-Blog &#187; C#</title>
	<atom:link href="http://blog.fabse.net/category/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fabse.net</link>
	<description>Was bewegt mich; was nicht!</description>
	<lastBuildDate>Fri, 20 Jan 2012 22:06:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>String.GetHashCode() Internals</title>
		<link>http://blog.fabse.net/2011/10/25/string-gethashcode-internals/</link>
		<comments>http://blog.fabse.net/2011/10/25/string-gethashcode-internals/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 18:11:56 +0000</pubDate>
		<dc:creator>Fabse</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[coding]]></category>

		<guid isPermaLink="false">http://blog.fabse.net/2011/10/25/string-gethashcode-internals/</guid>
		<description><![CDATA[While I was eating dinner, I had this somehow suprising question in my mind: How is String.GetHashCode() implemented? Is it fast? It needs a linear time based on the length of the string. This is understandable if you think about &#8230; <a href="http://blog.fabse.net/2011/10/25/string-gethashcode-internals/">Continue reading <span class="meta-nav">&#8594;</span></a><p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></description>
			<content:encoded><![CDATA[<p>While I was eating dinner, I had this somehow suprising question in my mind: How is String.GetHashCode() implemented? Is it fast?</p>
<p>It needs a linear time based on the length of the string. This is understandable if you think about what it is doing. It needs to generate a “Fingerprint”-number based on its content, so you need to take a look at all the content at least once. So it is O(N).</p>
<p>I was going to do something more useful while I noticed all the precompiler conditions. That is very interesting! The function returns different results whether it is compiled for 32bit or 64bit. The debug version of the framework (Microsoft internal only?) even changes its resulting hashcodes with every buildnumber.</p>
<blockquote><p>We want to ensure we can change our hash function daily.     <br />This is perfectly fine as long as you don&#8217;t persist the      <br />value from GetHashCode to disk or count on String A       <br />hashing before string B.&#160; Those are bugs in your code.      </p>
</blockquote>
<p>So you better avoid storing hashcodes and you should not exchange hashcodes across process-boundarys. Your communication partner may use a different number of bits!</p>
<p>Last but not least: the result is not stored but recomputed every time you call the function. The implementation is following the advice to not store its result itself.</p>
<p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabse.net/2011/10/25/string-gethashcode-internals/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dependency injection &amp; their Pitfalls*</title>
		<link>http://blog.fabse.net/2011/09/25/dependency-injection-their-pitfalls/</link>
		<comments>http://blog.fabse.net/2011/09/25/dependency-injection-their-pitfalls/#comments</comments>
		<pubDate>Sun, 25 Sep 2011 17:32:56 +0000</pubDate>
		<dc:creator>Fabse</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[dependency injection]]></category>
		<category><![CDATA[Prism]]></category>

		<guid isPermaLink="false">http://blog.fabse.net/2011/09/25/dependency-injection-their-pitfalls/</guid>
		<description><![CDATA[After I had my dependency injection set up and running, I noticed a shift in my way of developing. I started to be more focused on only one class and their implementation at a time. If I felt the need &#8230; <a href="http://blog.fabse.net/2011/09/25/dependency-injection-their-pitfalls/">Continue reading <span class="meta-nav">&#8594;</span></a><p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></description>
			<content:encoded><![CDATA[<p>After I had my dependency injection set up and running, I noticed a shift in my way of developing. I started to be more focused on only one class and their implementation at a time. If I felt the need for another service instance, I just added it to the constructor and would go on coding. I thought that the dependency injection container would take care of how to create the new service for me.</p>
<p><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.fabse.net/wp-content/uploads/image54.png" width="232" height="214" /></p>
<p>This is nothing fancy so far. After coding for straight 20 minutes without any testing in between I decided to test it. I noticed my machine was doing really nothing but burning cpu for a bunch of seconds and quitting then with a StackoverflowException. I had no idea what was going on.</p>
<p>The exception was not really telling too much about the problem. The only thing was a truncated stacktrace. It had something to do with the container trying to create an instance of a service. Without any further information it would be hard to pinpoint this so I decided to search for trace information. I am using <a href="http://compositewpf.codeplex.com/" target="_blank">Microsoft Prism</a> with the Unity container for inversion of control. So does Unity provide any traces of what is going on? Surprisingly, this is not the case! There is no magic switch.</p>
<p>So I had no choice but removing constructor arguments here and there until I found the root problem. I had managed to create a circular reference:</p>
<p><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.fabse.net/wp-content/uploads/image61.png" width="232" height="214" /></p>
<p><a href="http://msdn.microsoft.com/en-us/library/ff660897%28v=pandp.20%29.aspx" target="_blank">The MSDN</a> is telling me, that it is my responsibility to prevent this and it also warns of endless recursion. Endless recursion always ends with an StackoverflowException.</p>
<p>My solution was simple. I removed the circular reference through removing one reference. It was not used anyway.</p>
<p><em>*The name of this article is freely leaned on the name of the blog </em><a href="http://eai-technologies-and-their-pitfalls.blogspot.com/" target="_blank"><em>EAI Technologies &amp; their Pitfalls</em></a><em> of an ex coworker</em> <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Winking smile" src="http://blog.fabse.net/wp-content/uploads/wlEmoticon-winkingsmile3.png" /></p>
<p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabse.net/2011/09/25/dependency-injection-their-pitfalls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>String.Split() Kwik-e</title>
		<link>http://blog.fabse.net/2011/09/01/string-split-kwik-e/</link>
		<comments>http://blog.fabse.net/2011/09/01/string-split-kwik-e/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 09:23:30 +0000</pubDate>
		<dc:creator>Fabse</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[Kwik-e]]></category>

		<guid isPermaLink="false">http://blog.fabse.net/?p=580</guid>
		<description><![CDATA[While I was cleaning up some legacy code I found an overly complex usage of String.Split() in several places: var sentence = &#34;Hello World!&#34;; var words = sentence.Split(new char[] { ' ' }); If you take a look at the &#8230; <a href="http://blog.fabse.net/2011/09/01/string-split-kwik-e/">Continue reading <span class="meta-nav">&#8594;</span></a><p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></description>
			<content:encoded><![CDATA[<p>While I was cleaning up some legacy code I found an overly complex usage of String.Split() in several places:</p>
<pre class="code"><span style="color: blue">var </span>sentence = <span style="color: #a31515">&quot;Hello World!&quot;</span>;
<span style="color: blue">var </span>words = sentence.Split(<span style="color: blue">new char</span>[] { <span style="color: #a31515">' ' </span>});</pre>
<p>If you take a look at the available overloads on Split() you may miss the params keyword. In fact it isn’t even visible on the overview page:</p>
<p><a href="http://msdn.microsoft.com/de-de/library/y7h14879%28v=VS.100%29.aspx"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.fabse.net/wp-content/uploads/image49.png" width="326" height="329" /></a></p>
<p>But if you take a closer look on Split(char[]) you will see this:</p>
<p><a href="http://msdn.microsoft.com/de-de/library/b873y76a.aspx"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.fabse.net/wp-content/uploads/image50.png" width="229" height="53" /></a></p>
<p>The params keyword tells you that the method accepts any number of arguments of type char. So you could also provide only one, which will simplify the given sample to:</p>
<pre class="code"><span style="color: blue">var </span>sentence = <span style="color: #a31515">&quot;Hello World!&quot;</span>;
<span style="color: blue">var </span>words = sentence.Split(<span style="color: #a31515">' '</span>);</pre>
<p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabse.net/2011/09/01/string-split-kwik-e/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Linq Kwik-e</title>
		<link>http://blog.fabse.net/2011/08/29/linq-kwik-e/</link>
		<comments>http://blog.fabse.net/2011/08/29/linq-kwik-e/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 21:19:46 +0000</pubDate>
		<dc:creator>Fabse</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[Kwik-e]]></category>
		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false">http://blog.fabse.net/?p=572</guid>
		<description><![CDATA[Really often I use the Linq extension methods to formulate a query to reduce a set of data to a single value. Most of the time I refer to the First() method for this use case. var fabse = myList.Where(p &#8230; <a href="http://blog.fabse.net/2011/08/29/linq-kwik-e/">Continue reading <span class="meta-nav">&#8594;</span></a><p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Really often I use the Linq extension methods to formulate a query to reduce a set of data to a single value. Most of the time I refer to the First() method for this use case.</p>
<pre class="code"><span style="color: blue;">var </span>fabse = myList.Where(p =&gt; p.Name == <span style="color: #a31515;">"Fabse"</span>).First();</pre>
<p>There are several ways to improve this scenario. First has an overload where it accepts a predicate function, so the following example yields the same result:</p>
<pre class="code"><span style="color: blue;">var </span>fabse = myList.First(p =&gt; p.Name == <span style="color: #a31515;">"Fabse"</span>);</pre>
<p>But what happens if your list has no elements fulfilling your filter? First() will throw an exception. It is considered bad style to use exceptions to handle program flow. But is quite hard sticking to First() and avoiding the exception at the same time.</p>
<p>It is better to use FirstOrDefault() if there is the possibility of not getting any result. If there is no result, the default for the inferred data type is used, which is null for all reference types and 0 (zero) or false for int/float/double/… and bool. Sample:</p>
<pre class="code"><span style="color: blue;">var </span>fabse = myList.FirstOrDefault(p =&gt; p.Name == <span style="color: #a31515;">"Fabse"</span>);
<span style="color: blue;">if </span>(fabse != <span style="color: blue;">null</span>)
{
    <span style="color: green;">//use fabse ;-</span><span style="color: green;">)
</span>}</pre>
<p>Today I discovered the functions Single() and SingleOrDefault() which have nearly the same semantics but they will test the data source for further hits regarding your predicate. If there are other hits, you will see an InvalidOperationException.</p>
<p>I like this behavior very much because I often search for the existence of a somehow special object and based on this existence I do something or not. If there is more than one of these special objects, there is most likely something wrong with the data and it is better to stop the process and to examine the data. So an exception feels right at this moment.</p>
<p>To finish up this kwik-e: First() will give you the first (duh!) element while Last() and LastOrDefault() will give you the last element.</p>
<p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabse.net/2011/08/29/linq-kwik-e/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erste Schritte mit RavenDB</title>
		<link>http://blog.fabse.net/2011/04/25/erste-schritte-mit-ravendb/</link>
		<comments>http://blog.fabse.net/2011/04/25/erste-schritte-mit-ravendb/#comments</comments>
		<pubDate>Mon, 25 Apr 2011 20:47:00 +0000</pubDate>
		<dc:creator>Fabse</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[RavenDB]]></category>

		<guid isPermaLink="false">http://blog.fabse.net/2011/04/25/erste-schritte-mit-ravendb/</guid>
		<description><![CDATA[…sind ganz einfach! Runterladen, entpacken und Server starten über Batchdatei. Dann eines der Samples öffnen – bei mir war es SimpleClient. RavenDB ist eine schema-lose Dokumentendatenbank und damit Vertreter der NoSQL-Bewegung. Zugriffe erfolgen über REST. Es gibt eine .Net ClientAPI &#8230; <a href="http://blog.fabse.net/2011/04/25/erste-schritte-mit-ravendb/">Continue reading <span class="meta-nav">&#8594;</span></a><p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></description>
			<content:encoded><![CDATA[<p>…sind ganz einfach! Runterladen, entpacken und Server starten über Batchdatei. Dann eines der Samples öffnen – bei mir war es SimpleClient.</p>
<p><a href="http://ravendb.net/" target="_blank">RavenDB</a> ist eine schema-lose Dokumentendatenbank und damit Vertreter der <a href="http://de.wikipedia.org/wiki/NoSQL_%28Konzept%29" target="_blank">NoSQL</a>-Bewegung. Zugriffe erfolgen über <a href="http://de.wikipedia.org/wiki/Representational_State_Transfer" target="_blank">REST</a>. Es gibt eine .Net ClientAPI und mit der kann man in 3 Zeilen jedes beliebige Objekt in die Datenbank schreiben. Ich bin echt beeindruckt, wie unerwartet unkompliziert das geht.</p>
<p>Ich habe eine halbwegs klare Projektidee im Kopf, so musste ich einige konkrete Fragen klären, die durch das Lesen von <a href="http://ayende.com/blog/default.aspx" target="_blank">Ayendes Blog</a> (Tipp!!!) nicht zu klären waren.</p>
<p>Kann man RavenDB embedded hosten? Ja! Neben dem Hosten über einen Windows Service oder über den IIS kann man auch im Client selbst die Datenbank hosten womit das ganze zu einer Standalone-App wird.</p>
<p>Wie gut kommt es mit Blobs klar? Hier habe ich lange probiert. Zuerst hatte ich immer ein Byte-Array in meinen Objekten, was aber schnell zu OutOfMemory-Situationen führt. Ich hatte mit ca. 1000 Objekten mit je 3mb Inhalt zu tun. Es erfolgt eine Base64-Codierung bei der Übertragung so dass zu einem Zeitpunkt in Server und Client in Summe vermutlich mindestens 4 Varianten gehalten werden. Wenn man die richtigen Google-Suchwörter verwendet, findet man heraus, dass RavenDB auch <a href="http://groups.google.com/group/ravendb/browse_thread/thread/7b73377adf3e09cd/43deb6f4db4ca9af?lnk=gst&amp;q=Attachments#43deb6f4db4ca9af" target="_blank">Attachments</a> als Konzept versteht. Hier gibt es wohl keine Transaktionalität aber dafür Performance! Mir gelang es, ein Attachment mit 335mb in 66s in die Datenbank zu pumpen, was für meine Anforderungen vollkommen genügt. Bei dem nächstgrößeren Versuch mit 500mb kam es zu einer OutOfMemoryException, aber das ist ok. Attachments können übrigens auch direkt durch einen Browser geladen werden!</p>
<p>Sollte jetzt der Eindruck entstanden sein, dass RavenDB langsam ist, dann muss ich dem Widersprechen. Mir gelang es die 1000 Objekte nur mit Metadaten und ohne Blobs in unter einer Sekunde in die Datenbank zu laden.</p>
<p>Ich bin sehr beendruckt von RavenDB und kann jedem nur empfehlen, sich selbst einen Eindruck zu verschaffen.</p>
<p><em>Mein Ostermontag ist jedenfalls gut angelegt</em> <img class="wlEmoticon wlEmoticon-openmouthedsmile" style="border-style: none;" src="http://blog.fabse.net/wp-content/uploads/wlEmoticon-openmouthedsmile.png" alt="Open-mouthed smile" /></p>
<p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabse.net/2011/04/25/erste-schritte-mit-ravendb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Distinct und die dunkle Seite!</title>
		<link>http://blog.fabse.net/2011/01/30/distinct-und-die-dunkle-seite/</link>
		<comments>http://blog.fabse.net/2011/01/30/distinct-und-die-dunkle-seite/#comments</comments>
		<pubDate>Sun, 30 Jan 2011 16:03:07 +0000</pubDate>
		<dc:creator>Fabse</dc:creator>
				<category><![CDATA[Büroleben]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[im Netz gefunden]]></category>

		<guid isPermaLink="false">http://blog.fabse.net/2011/01/30/distinct-und-die-dunkle-seite/</guid>
		<description><![CDATA[Im Projekt war aufgefallen, dass eine Komponente, die Key/Value Werte aus Nachrichten extrahiert, die Paare doppel extrahiert, wenn sie denn doppelt in der Nachricht sind und letztlich wurden die Paare dann auch mehrfach zu einer Nachricht in der Datenbank hinterlegt. &#8230; <a href="http://blog.fabse.net/2011/01/30/distinct-und-die-dunkle-seite/">Continue reading <span class="meta-nav">&#8594;</span></a><p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></description>
			<content:encoded><![CDATA[<p align="justify">Im Projekt war aufgefallen, dass eine Komponente, die Key/Value Werte aus Nachrichten extrahiert, die Paare doppel extrahiert, wenn sie denn doppelt in der Nachricht sind und letztlich wurden die Paare dann auch mehrfach zu einer Nachricht in der Datenbank hinterlegt. Mangels Mehrwert war nun die Idee, die Doppelten zu löschen. Vor dem Abspeichern in LINQ ein Distinct aufgerufen zusammen mit einer Standardimplementierung von IEqualityComparer und gut war.</p>
<p align="justify">Über ein einmaliges Skript auch die Doppelten aus der Datenbank entfernt, einen UNIQUE-Index angelegt und gut.</p>
<p align="justify">Und gut? Am nächsten Tag ging einen halben Tag lang nichts mehr. Die Komponente war an sich getestet, aber der Fall der aufgetreten war, war, dass die Datenbank in Form des MS SQL Server Gleichheit viel weitreichender definiert, als mein Code es tat, so kam es, dass der UNIQUE-Index&#160; Transaktionen zurück rollte, die eigentlich nur distinkte Paare enthielt.</p>
<p align="justify">Was war passiert? Im C#-Code hatte ich Equals über String.Equals implementiert. Der SQL Server entscheidet bei Gleichheit aber ohne Betrachtung der Groß-/Kleinschreibung. Während des Entwickelns des Bugfixes ist dann noch aufgefallen, dass der SQL Server auch “ss” und “ß” als gleich betrachtet.</p>
<p align="justify">Geholfen hatte auf Stackoverflow die <a href="http://stackoverflow.com/questions/4190143/how-to-maintain-unique-list-before-saving-to-database-c/4190183#4190183" target="_blank">Antwort von cdhowie</a>. Die generische Lösung unterstützt dabei auch noch immer GetHashCode, da sonst die Performance leidet:</p>
<p><code><span style="font-family: verdana">String.Equals(a.Description, b.Description, StringComparison.<strong>OrdinalIgnoreCase</strong>);</span></code></p>
<p><code><span style="font-family: verdana">und</span></code></p>
<p><code><span style="font-family: verdana">StringComparer.<strong>OrdinalIgnoreCase</strong>.GetHashCode(obj.Description);</span></code></p>
<p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabse.net/2011/01/30/distinct-und-die-dunkle-seite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blogtipp des Tages: Ayende @ Rahien</title>
		<link>http://blog.fabse.net/2010/09/16/blogtipp-des-tages-ayende-rahien/</link>
		<comments>http://blog.fabse.net/2010/09/16/blogtipp-des-tages-ayende-rahien/#comments</comments>
		<pubDate>Thu, 16 Sep 2010 06:37:11 +0000</pubDate>
		<dc:creator>Fabse</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[Blogwelt]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[im Netz gefunden]]></category>

		<guid isPermaLink="false">http://blog.fabse.net/2010/09/16/blogtipp-des-tages-ayende-rahien/</guid>
		<description><![CDATA[Er postet viel anspruchsvolle Gedanken und Probleme im täglichen .Net Code-Alltag mit speziellem Fokus auf Datenbanken, Persistenz, NHibernate und seinen NHibernateProfiler… Ich glaube er schläft nie und tut den ganzen Tag nichts anderes, aber wenn man selbst mal Zeit hat, &#8230; <a href="http://blog.fabse.net/2010/09/16/blogtipp-des-tages-ayende-rahien/">Continue reading <span class="meta-nav">&#8594;</span></a><p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Er postet viel anspruchsvolle Gedanken und Probleme im täglichen .Net Code-Alltag mit speziellem Fokus auf Datenbanken, Persistenz, NHibernate und seinen NHibernateProfiler…</p>
<p>Ich glaube er schläft nie und tut den ganzen Tag nichts anderes, aber wenn man selbst mal Zeit hat, sind seine Beiträge immer interessant und auch die Kommentare sind idR sehr qualitativ.</p>
<p><a title="Ayende @ Rahien" href="http://ayende.com/Blog/Default.aspx">Ansehen!</a></p>
<p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabse.net/2010/09/16/blogtipp-des-tages-ayende-rahien/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stringformatierung &#8211; Die Zusammenfassung</title>
		<link>http://blog.fabse.net/2010/07/04/stringformatierung-die-zusammenfassung/</link>
		<comments>http://blog.fabse.net/2010/07/04/stringformatierung-die-zusammenfassung/#comments</comments>
		<pubDate>Sun, 04 Jul 2010 19:34:33 +0000</pubDate>
		<dc:creator>Fabse</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[im Netz gefunden]]></category>

		<guid isPermaLink="false">http://blog.fabse.net/2010/07/04/stringformatierung-die-zusammenfassung/</guid>
		<description><![CDATA[Wenn ich einen Wert mal non-standard formatiert ausgeben will, muss ich regelmäßig die MSDN rauf und runter suchen, weil mir der richtige Formatstring fehlt. Jetzt habe ich ein schönes cheat sheet gefunden, was dies auf wenigen Seiten zusammenfasst. Quelle --- &#8230; <a href="http://blog.fabse.net/2010/07/04/stringformatierung-die-zusammenfassung/">Continue reading <span class="meta-nav">&#8594;</span></a><p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Wenn ich einen Wert mal non-standard formatiert ausgeben will, muss ich regelmäßig die MSDN rauf und runter suchen, weil mir der richtige Formatstring fehlt.</p>
<p>Jetzt habe ich ein schönes cheat sheet gefunden, was dies auf wenigen Seiten zusammenfasst.</p>
<p><a href="http://john-sheehan.com/blog/wp-content/uploads/msnet-formatting-strings.pdf"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.fabse.net/wp-content/uploads/image35.png" width="166" height="754" /></a> </p>
<p><a href="http://john-sheehan.com/blog/net-cheat-sheets/">Quelle</a></p>
<p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabse.net/2010/07/04/stringformatierung-die-zusammenfassung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BizTalk: Sending emails with attachments using a pipeline component</title>
		<link>http://blog.fabse.net/2010/06/25/biztalk-sending-emails-with-attachments-using-a-pipeline-component/</link>
		<comments>http://blog.fabse.net/2010/06/25/biztalk-sending-emails-with-attachments-using-a-pipeline-component/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 06:33:02 +0000</pubDate>
		<dc:creator>Fabse</dc:creator>
				<category><![CDATA[BizTalk]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[coding]]></category>

		<guid isPermaLink="false">http://blog.fabse.net/?p=456</guid>
		<description><![CDATA[There are several locations on the web where you are told how to send emails and also how to send attachments with them as well. I had a working piece of code doing exactly this but I had to redo &#8230; <a href="http://blog.fabse.net/2010/06/25/biztalk-sending-emails-with-attachments-using-a-pipeline-component/">Continue reading <span class="meta-nav">&#8594;</span></a><p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></description>
			<content:encoded><![CDATA[<p>There are <a href="http://www.tech-archive.net/Archive/BizTalk/microsoft.public.biztalk.general/2006-12/msg00141.html">several locations</a> on the web where you are told how to send emails and also how to send attachments with them as well.</p>
<p>I had a working piece of code doing exactly this but I had to redo it using a pipeline componentan instead of an orchestration.</p>
<p>Everything is straightforward. If you had set the context value in your orchestration like this:</p>
<p>EmailOut(SMTP.MessagePartsAttachments) = 2;</p>
<p>you would take a look in <a href="http://msdn.microsoft.com/en-us/library/smtp.messagepartsattachments%28BTS.10%29.aspx">the msdn</a> to get the values right and then translate it to the following code in your pipeline component:</p>
<p>inmsg.Context.Write(&#8220;MessagePartsAttachments&#8221;,<br />
&#8220;http://schemas.microsoft.com/BizTalk/2003/smtp-properties&#8221;, 2);</p>
<p>I did this with every context value and tested it. It worked well but there was no attachment?! But there was also no error!</p>
<p>Finding the solution took me more time then I am willing to admit&#8230;</p>
<p>If you take a sharp look in the MSDN then you might find this:</p>
<p>[SerializableAttribute]<br />
[GuidAttribute("9EE763F5-ECE7-42f6-BE97-38EA64FB7607")]<br />
[IsSensitivePropertyAttribute(false)]<br />
[PropertyGuidAttribute("9EE763F5-ECE7-42f6-BE97-38EA64FB7607")]<br />
[PropertyTypeAttribute("MessagePartsAttachments",<br />
"http://schemas.microsoft.com/BizTalk/2003/smtp-properties",<br />
<strong>"unsignedInt", "System.UInt32"</strong>)]<br />
public sealed class MessagePartsAttachments : MessageContextPropertyBase</p>
<p>I was desperate at best and tried everything and this one worked:</p>
<p>inmsg.Context.Write(&#8220;MessagePartsAttachments&#8221;,<br />
&#8220;http://schemas.microsoft.com/BizTalk/2003/smtp-properties&#8221;, <strong>(UInt32)</strong>2);</p>
<p>You cannot see any difference at all if you take a look at a suspended/tracked message but this was the cause of the missing attachments. I hope this might save you some time!</p>
<p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabse.net/2010/06/25/biztalk-sending-emails-with-attachments-using-a-pipeline-component/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Streaminhalt im Debugger</title>
		<link>http://blog.fabse.net/2010/02/17/streaminhalt-im-debugger/</link>
		<comments>http://blog.fabse.net/2010/02/17/streaminhalt-im-debugger/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 10:32:11 +0000</pubDate>
		<dc:creator>Fabse</dc:creator>
				<category><![CDATA[BizTalk]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[Lösung]]></category>

		<guid isPermaLink="false">http://blog.fabse.net/?p=442</guid>
		<description><![CDATA[Sitzt man mal wieder vor dem Debugger und interessiert sich, was nun eigentlich für Daten in diesem Stream stehen, dann hilft das Immediate Window. Aber selbst damit ist es mir bisher nicht unbedingt einfach gefallen. Folgendes Snippet erfüllt den Job &#8230; <a href="http://blog.fabse.net/2010/02/17/streaminhalt-im-debugger/">Continue reading <span class="meta-nav">&#8594;</span></a><p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Sitzt man mal wieder vor dem Debugger und interessiert sich, was nun eigentlich für Daten in diesem Stream stehen, dann hilft das Immediate Window. Aber selbst damit ist es mir bisher nicht unbedingt einfach gefallen.</p>
<p>Folgendes Snippet erfüllt den Job aber als Einzeiler:</p>
<pre>File.WriteAllText("c:\\streamOut.txt", new StreamReader(meinStream).ReadToEnd());</pre>
<p>Zu beachten ist, dass je nach Typ von meinStream die Position anschließend zurück gesetzt werden muss oder auch, das dies gar nicht möglich ist und daher die weitere Programmausführung fehlerhaft wird.</p>
<p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabse.net/2010/02/17/streaminhalt-im-debugger/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Seltsamer Fehler beim Start einer Silverlight-Anwendung.</title>
		<link>http://blog.fabse.net/2009/09/09/seltsamer-fehler-beim-start-einer-silverlight-anwendung/</link>
		<comments>http://blog.fabse.net/2009/09/09/seltsamer-fehler-beim-start-einer-silverlight-anwendung/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 13:42:37 +0000</pubDate>
		<dc:creator>Fabse</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[coding]]></category>

		<guid isPermaLink="false">http://blog.fabse.net/?p=419</guid>
		<description><![CDATA[Nach “F5” kommt erst dieses Fenster: Und dann dieses: Es handelt sich um eine Silverlight-Anwendung mit den .Net RIA Services. Bilder sind auch involviert. Der Fehler kommt, egal ob die Anwendung im Internet Explorer oder im Firefox startet, allerdings nur &#8230; <a href="http://blog.fabse.net/2009/09/09/seltsamer-fehler-beim-start-einer-silverlight-anwendung/">Continue reading <span class="meta-nav">&#8594;</span></a><p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Nach “F5” kommt erst dieses Fenster:</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" src="http://blog.fabse.net/wp-content/uploads/image28.png" border="0" alt="image" width="423" height="172" /></p>
<p>Und dann dieses:</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ArgumentException occured: Der Kulturname &quot;uploads&quot; wird nicht unterstützt. Parametername: name" src="http://blog.fabse.net/wp-content/uploads/image29.png" border="0" alt="ArgumentException occured: Der Kulturname &quot;uploads&quot; wird nicht unterstützt. Parametername: name" width="452" height="277" /></p>
<p>Es handelt sich um eine Silverlight-Anwendung mit den .Net RIA Services. Bilder sind auch involviert. Der Fehler kommt, egal ob die Anwendung im Internet Explorer oder im Firefox startet, allerdings nur einmal nach einem Rebuild. Folgende Starts haben den Fehler nicht und klicke ich auf “Continue” funktioniert meine Anwendung auch ganz normal.</p>
<p>Ich habe schon im ganzen Projekt nach “uploads” gesucht ohne Erfolg sowie das komplette Projekt vor und nach dem ersten Start gedifft, aber auch hier keine Auffälligkeiten.</p>
<p>Ungewöhnlich ist auch, dass die Nachricht der Exception auf Deutsch ist, obwohl Visual Studio, Silverlight SDK und die .Net RIA Services auf Englisch installiert sind.</p>
<p><strong>Ich konnte das Problem bisher nicht lösen, daher die Bitte, wer was weiß, sich bei mir zu melden. Habe ich eine Lösung, werde ich ein Update schreiben.</strong></p>
<p><span id="more-419"></span></p>
<p><strong>Hier noch ein Stacktrace der Exception (Code von mir ist nicht involviert!):</strong></p>
<p style="text-align: left;">&gt;	mscorlib.dll!System.Globalization.CultureTableRecord.CultureTableRecord(string cultureName = &#8220;uploads&#8221;, bool useUserOverride) + 0x41d bytes</p>
<p style="text-align: left;">mscorlib.dll!System.Globalization.CultureTableRecord.GetCultureTableRecord(string name = &#8220;uploads&#8221;, bool useUserOverride = true) + 0xd6 bytes</p>
<p style="text-align: left;">mscorlib.dll!System.Globalization.CultureInfo.CultureInfo(string name, bool useUserOverride) + 0x2e bytes</p>
<p style="text-align: left;">System.Web.dll!System.Web.HttpServerUtility.CreateReadOnlyCultureInfo(string name = &#8220;uploads&#8221;) + 0xc9 bytes</p>
<p style="text-align: left;">System.Web.dll!System.Web.UI.Util.IsCultureName(string s) + 0&#215;49 bytes</p>
<p style="text-align: left;">System.Web.dll!System.Web.Compilation.StandardDiskBuildResultCache.FindSatelliteDirectories() + 0&#215;80 bytes</p>
<p style="text-align: left;">System.Web.dll!System.Web.Compilation.BuildManager.RegularAppRuntimeModeInitialize() + 0&#215;74 bytes</p>
<p style="text-align: left;">System.Web.dll!System.Web.Compilation.BuildManager.Initialize() + 0xf2 bytes</p>
<p style="text-align: left;">System.Web.dll!System.Web.Compilation.BuildManager.InitializeBuildManager() + 0xcd bytes</p>
<p style="text-align: left;">System.Web.dll!System.Web.HttpRuntime.HostingInit(System.Web.Hosting.HostingEnvironmentFlags hostingFlags = Default) + 0xe1 bytes</p>
<p style="text-align: left;">System.Web.dll!System.Web.Hosting.HostingEnvironment.Initialize(System.Web.Hosting.ApplicationManager appManager, System.Web.Hosting.IApplicationHost appHost, System.Web.Configuration.IConfigMapPathFactory configMapPathFactory, System.Web.Hosting.HostingEnvironmentParameters hostingParameters) + 0x26c bytes</p>
<p style="text-align: left;">[Appdomain Transition]</p>
<p style="text-align: left;">System.Web.dll!System.Web.Hosting.ApplicationManager.CreateAppDomainWithHostingEnvironment(string appId, System.Web.Hosting.IApplicationHost appHost, System.Web.Hosting.HostingEnvironmentParameters hostingParameters) + 0&#215;379 bytes</p>
<p style="text-align: left;">System.Web.dll!System.Web.Hosting.ApplicationManager.CreateAppDomainWithHostingEnvironmentAndReportErrors(string appId = &#8220;f2edd2c8&#8243;, System.Web.Hosting.IApplicationHost appHost, System.Web.Hosting.HostingEnvironmentParameters hostingParameters) + 0x2f bytes</p>
<p style="text-align: left;">System.Web.dll!System.Web.Hosting.ApplicationManager.GetAppDomainWithHostingEnvironment(string appId = &#8220;f2edd2c8&#8243;, System.Web.Hosting.IApplicationHost appHost, System.Web.Hosting.HostingEnvironmentParameters hostingParameters) + 0x6d bytes</p>
<p style="text-align: left;">System.Web.dll!System.Web.Hosting.ApplicationManager.CreateObjectInternal(string appId, System.Type type = {Name = &#8220;Host&#8221; FullName = &#8220;Microsoft.VisualStudio.WebHost.Host&#8221;}, System.Web.Hosting.IApplicationHost appHost, bool failIfExists = false, System.Web.Hosting.HostingEnvironmentParameters hostingParameters) + 0x3a bytes</p>
<p style="text-align: left;">System.Web.dll!System.Web.Hosting.ApplicationManager.CreateObject(string appId, System.Type type, string virtualPath, string physicalPath, bool failIfExists, bool throwOnError) + 0x8d bytes</p>
<p style="text-align: left;">System.Web.dll!System.Web.Hosting.ApplicationManager.CreateObject(string appId, System.Type type, string virtualPath, string physicalPath, bool failIfExists) + 0&#215;35 bytes</p>
<p style="text-align: left;">WebDev.WebHost.dll!Microsoft.VisualStudio.WebHost.Server.GetHost() + 0xe0 bytes</p>
<p style="text-align: left;">WebDev.WebHost.dll!Microsoft.VisualStudio.WebHost.Server.OnSocketAccept(object acceptedSocket) + 0&#215;62 bytes</p>
<p style="text-align: left;">mscorlib.dll!System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(object state) + 0x2f bytes</p>
<p style="text-align: left;">mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x6f bytes</p>
<p style="text-align: left;">mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(System.Threading._ThreadPoolWaitCallback tpWaitCallBack) + 0&#215;53 bytes</p>
<p style="text-align: left;">mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(object state) + 0&#215;59 bytes</p>
<p style="text-align: left;">
<p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabse.net/2009/09/09/seltsamer-fehler-beim-start-einer-silverlight-anwendung/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>.Net RIA Services &#8211; kurz erkl&#228;rt</title>
		<link>http://blog.fabse.net/2009/07/27/net-ria-services-kurz-erklrt/</link>
		<comments>http://blog.fabse.net/2009/07/27/net-ria-services-kurz-erklrt/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 08:59:34 +0000</pubDate>
		<dc:creator>Fabse</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[coding]]></category>

		<guid isPermaLink="false">http://blog.fabse.net/2009/07/27/net-ria-services-kurz-erklrt/</guid>
		<description><![CDATA[Ich hab mich etwas mit den .Net RIA Services beschäftigt und möchte nun einen groben Überblick geben. Wir stellen uns also eine 3-Schichten Architektur vor, bestehend aus Silverlight 3, ASP.net und einem quasi beliebigem Data Access Layer. Der Data Access &#8230; <a href="http://blog.fabse.net/2009/07/27/net-ria-services-kurz-erklrt/">Continue reading <span class="meta-nav">&#8594;</span></a><p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.fabse.net/wp-content/uploads/image24.png" rel="lightbox[394]"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.fabse.net/wp-content/uploads/image-thumb9.png" width="450" height="236" /></a> </p>
<p>Ich hab mich etwas mit den .Net RIA Services beschäftigt und möchte nun einen groben Überblick geben. Wir stellen uns also eine 3-Schichten Architektur vor, bestehend aus Silverlight 3, ASP.net und einem quasi beliebigem Data Access Layer.</p>
<p>Der Data Access Layer erzeugt aus einer Datenbank Objekte, welche nun in der mittleren Schicht sind (im Bild “Order”) und bietet auch die Standard CRUD-Funktionalität. In der Regel kann man diese Objekte nicht ohne weiteres an den Client übergeben.</p>
<p>Hier kommen nun die .Net RIA Services ins Spiel und generieren in der Silverlight-Applikation eine identische Klasse und ein asynchrones Kontextobjekt, um mit der Serviceschicht zu interagieren.</p>
<p>Alles was man noch tun muss, ist in der Mittelschicht eine Serviceklasse zu schreiben, die alle Funktionen zur Verfügung stellt, die der Client nutzen können soll. Dies können die normalen CRUD-Operationen sein, spezielle Servicemethoden, die mit den Objekten interagieren oder ganz allgemein beliebige Funktionen.</p>
<p>Reichert man die Klassen durch Metadaten an, bekommt man die Validierung der Daten auf beiden Schichten “fast geschenkt”:</p>
<p>[Range(0, 120, ErrorMessage = &quot;Sprechende Fehlermeldung!&quot;)]   <br />public int? Age { get; set; }</p>
<p>Hat man dies z.B. so bei einer Person definiert, wird der Nutzer bereits beim Eingeben der Daten auf dem Client mit einer sprechenden Fehlermeldung auf seinen Fehler hingewiesen. Zusätzlich wird aber auch auf der Mittelschicht eine erneute Validierung der Daten vorgenommen. Dies ist eine sehr schöne Ausprägung des <a title="Don&#39;t Repeat Yourself" href="http://www.clean-code-developer.de/wiki/CcdRoterGrad#DontRepeatYourselfDRY">DRY-Prinzips</a>.</p>
<p>Außerdem werden alle Dateien mit dem Dateinamen *.shared.cs oder *.shared.vb in den Client kopiert, was Shared Code ermöglicht. Dies kann man nutzen, um generierte Properties anzulegen.</p>
<p>Das Ganze erleichtert den Entwicklungsprozess von viel langweiliger Arbeit und gibt einem mehr Zeit, für die wesentlichen Aspekte!</p>
<p>Weiterführende Links:</p>
<p><a href="http://videos.visitmix.com/MIX09/T40F">Präsentation auf der Mix09</a></p>
<p><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=76bb3a07-3846-4564-b0c3-27972bcaabce&amp;displaylang=en">Download von Setup und Dokumentation</a></p>
<p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabse.net/2009/07/27/net-ria-services-kurz-erklrt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fluent Interfaces: Sinnvoll?</title>
		<link>http://blog.fabse.net/2009/06/04/fluent-interfaces-sinnvoll/</link>
		<comments>http://blog.fabse.net/2009/06/04/fluent-interfaces-sinnvoll/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 15:31:41 +0000</pubDate>
		<dc:creator>Fabse</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[coding]]></category>

		<guid isPermaLink="false">http://blog.fabse.net/2009/06/04/fluent-interfaces-sinnvoll/</guid>
		<description><![CDATA[Ich hatte Fluent Interfaces mal in einem Blog gelesen und hatte es seit dem auf meinem Zettel stehen, das mal genauer anzusehen. Was ist das eigentlich? Wikipedia weiß es natürlich. Sucht man bei Google danach findet man Blogs mit Einträgen &#8230; <a href="http://blog.fabse.net/2009/06/04/fluent-interfaces-sinnvoll/">Continue reading <span class="meta-nav">&#8594;</span></a><p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Ich hatte Fluent Interfaces mal in einem Blog gelesen und hatte es seit dem auf meinem Zettel stehen, das mal genauer anzusehen.</p>
<p>Was ist das eigentlich? <a title="Fluent_Interface bei Wikipedia (de)" href="http://de.wikipedia.org/wiki/Fluent_Interface">Wikipedia weiß es natürlich.</a></p>
<p>Sucht man bei Google danach findet man Blogs mit Einträgen von 2006/2007…sind Fluent Interfaces schon tot? Vielleicht!</p>
<p>Einige Beispiele:</p>
<blockquote><p>IConfigurationFluent config =      <br />&#160;&#160;&#160;&#160;&#160; new ConfigurationFluent().SetColor(&quot;blue&quot;)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .SetHeight(1)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .SetLength(2)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .SetDepth(3);</p>
</blockquote>
<p>Das schreit einfach nach dem Object Initializer von C#! In etwa so:</p>
<blockquote><p>IConfiguration config =      <br />&#160;&#160;&#160;&#160;&#160; new Configuration {Color = “blue”, Height=1, Length=2, Depth=3};</p>
</blockquote>
<p>Dann spart mach sich das zusätzliche “return this” in der Implementierung.</p>
<p>Ok, dann hat <a href="http://blog.troyd.net/PermaLink,guid,5cdd4862-857a-488d-a577-c6d21b548f19.aspx">Troy Demonbreun</a> folgendes Beispiel:</p>
<blockquote><p>order     <br />&#160;&#160;&#160; .AddFreeShipping()      <br />&#160;&#160;&#160; .IncludeItem(15)      <br />&#160;&#160;&#160; .SuppressTax();</p>
</blockquote>
<p>Das sieht an sich ja ganz nett aus, allerdings hat seine Implementierung den “Fehler”, dass IncludeItem() den Kontext von Order auf OrderItem ändert. Nach meinem Verständnis von Fluent Interfaces müsste aber folgendes möglich sein (geht bei ihm nicht):</p>
<blockquote></blockquote>
<blockquote><p>order     <br />&#160;&#160;&#160; .AddFreeShipping()      <br />&#160;&#160;&#160; .IncludeItem(15).SuppressTax()      <br />&#160;&#160;&#160; .IncludeItem(4)      <br />&#160;&#160;&#160; .IncludeItem(77)      <br />&#160;&#160;&#160; .PrepareAsGift();</p>
</blockquote>
<p>Und als drittes Beispiel hab ich folgendes, leicht komplexes Konstrukt gefunden:</p>
<blockquote><p>EventComponent planningMeeting =     <br />&#160;&#160; Plan.Event(&quot;Project planning meeting&quot;).      <br />&#160;&#160;&#160;&#160;&#160; RelatedTo(planningTask).      <br />&#160;&#160;&#160;&#160;&#160; WithPriority(1).      <br />&#160;&#160;&#160;&#160;&#160; At(&quot;Head office&quot;).      <br />&#160;&#160;&#160;&#160;&#160; OrganizedBy(&quot;jane@megacorp.com&quot;, &quot;Jane Doe&quot;).      <br />&#160;&#160;&#160;&#160;&#160; StartingAt(&quot;12:00&quot;).Lasting(45).Minutes.      <br />&#160;&#160;&#160;&#160;&#160; Attendants(      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;peter@megacorp.com&quot;,      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;paul@megacorp.com&quot;,      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &quot;mary@contractor.com&quot;).AreRequired.      <br />&#160;&#160;&#160;&#160;&#160; Attendant(&quot;john@megacorp.com&quot;).IsOptional.      <br />&#160;&#160;&#160;&#160;&#160; Resource(&quot;Projector&quot;).IsRequired.      <br />&#160;&#160;&#160;&#160;&#160; ClassifyAs(&quot;Public&quot;).      <br />&#160;&#160;&#160;&#160;&#160; CategorizeAs(&quot;Businees&quot;, &quot;Development&quot;).      <br />&#160;&#160;&#160;&#160;&#160; Recurring.Until(2008).EverySingle.Week.On(Day.Thursday).      <br />&#160;&#160;&#160;&#160;&#160; Except.Each.Year.In(Month.July | Month.August);      <br />planningMeeting.SendInvitations();</p>
</blockquote>
<p>…hier kann ich schon etwas verstehen, warum Fluent Interfaces (=FIs) sexy sein könnten. Aber zuerst muss ich hier auch sofort wieder an Object Initializer und Collection Initializer denken (Nein, ich bau das jetzt nicht um <img src='http://blog.fabse.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' />  ) und dann hab ich da noch einen letzten Punkt zu: Man kann FIs nur einsetzen, wenn man zu einem Zeitpunkt bereits alles weiß zu dem Objekt, was man erstellen will. Das ist an sich ja nicht schlecht, aber wie kommt denn die Liste der Attendants da rein? Doch meistens mit foreach und das geht nicht in dieser Kette von Aufrufen. </p>
<p>Ach und noch ein allerletzter Punkt: In diesem Ansatz muss ich viel Schmalz darauf verbraten, wann eine Methode Sinn macht:</p>
<blockquote><p>…Attendants( … ).Except.Minutes.WithPriority(1); //?!</p>
</blockquote>
<p><strong>Fazit:     <br /></strong>[x] Ich hab mir Fluent Interfaces angesehen    <br />[x] Ich weiß keinen guten Fall, wann das Ganze wirklich Sinn macht</p>
<p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabse.net/2009/06/04/fluent-interfaces-sinnvoll/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>MVVM in WPF</title>
		<link>http://blog.fabse.net/2009/02/18/mvvm-in-wpf/</link>
		<comments>http://blog.fabse.net/2009/02/18/mvvm-in-wpf/#comments</comments>
		<pubDate>Wed, 18 Feb 2009 09:31:34 +0000</pubDate>
		<dc:creator>Fabse</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[MVVM]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://blog.fabse.net/2009/02/18/mvvm-in-wpf/</guid>
		<description><![CDATA[Ein sehr guter Artikel von Josh Smith der den Model-View-ViewModel (MVVM) Ansatz mit WPF von Anfang bis Ende erklärt. Kann ich jedem, der sich für sowas interessiert, nur ans Herz legen! --- Unterst&#252;tze mich und meinen Blog und kauf dir &#8230; <a href="http://blog.fabse.net/2009/02/18/mvvm-in-wpf/">Continue reading <span class="meta-nav">&#8594;</span></a><p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></description>
			<content:encoded><![CDATA[<p><a href="http://msdn.microsoft.com/en-us/magazine/dd419663.aspx" target="_blank">Ein sehr guter Artikel</a> von Josh Smith der den Model-View-ViewModel (MVVM) Ansatz mit WPF von Anfang bis Ende erklärt. Kann ich jedem, der sich für sowas interessiert, nur ans Herz legen!</p>
<p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabse.net/2009/02/18/mvvm-in-wpf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UDP Broadcasts mit C# versenden (extended)</title>
		<link>http://blog.fabse.net/2008/10/29/udp-broadcasts-mit-csharp-versenden-extended/</link>
		<comments>http://blog.fabse.net/2008/10/29/udp-broadcasts-mit-csharp-versenden-extended/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 20:00:50 +0000</pubDate>
		<dc:creator>Fabse</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[Netzwerk]]></category>

		<guid isPermaLink="false">http://blog.fabse.net/2008/10/29/udp-broadcasts-mit-c-versenden-extended/</guid>
		<description><![CDATA[Den Standardweg (Da ist übrigens ein Fehler drin: SocketOptionName.Broadcast muss auf 1 statt auf 0 gesetzt werden), wie man Broadcasts versendet, hatte auf meinem Rechner zur Folge, dass nur ein einziger Netzwerkadapter die Broadcasts versendete. Dies war nicht das, was &#8230; <a href="http://blog.fabse.net/2008/10/29/udp-broadcasts-mit-csharp-versenden-extended/">Continue reading <span class="meta-nav">&#8594;</span></a><p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Den <a href="http://dotnet-snippets.de/dns/c-broadcast-senden-SID567.aspx">Standardweg</a> (<em>Da ist übrigens ein Fehler drin: SocketOptionName.Broadcast muss auf 1 statt auf 0 gesetzt werden), </em>wie man Broadcasts versendet, hatte auf meinem Rechner zur Folge, dass nur ein einziger Netzwerkadapter die Broadcasts versendete. Dies war nicht das, was ich wollte, denn es war auch noch ein VMWare-Adapter.</p>
<p>Nach etwas Probieren fand ich heraus, dass statt <em>IPAddress.Broadcast</em> besser <em>IPAddress.Parse(&#8230;)</em> mit der richtigen Broadcast-IP für das jeweilige Netz genommen werden sollte. Ich suchte mir also das nötige Zeug von <a href="http://dotnet-snippets.de/dns/c-netzwerkinformationen-abfragen-SID197.aspx">zwei</a> <a href="http://www.codeproject.com/KB/dotnet/BroadCast.aspx">Artikeln</a> zusammen: Ich frage nun alle Netzwerkkarten ab, die IP können, kalkuliere deren Broadcast-IP und versende dann das Broadcast-Paket für jedes Netz einzeln in einer Schleife. Nun bekommen alle Netze meinen Broadcast, wie gewünscht!</p>
<p>Wer den Quelltext sehen will, sollte den Artikel weiterlesen!</p>
<p><span id="more-279"></span>
</p>
<div class="csharpcode">
<pre class="csharpcode"><span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">void</span> SendBroadcastPacket(<span class="kwrd">int</span> destinationPort, <span class="kwrd">byte</span>[] content)
{
    var NetworkInfo = <span class="kwrd">new</span> ManagementObjectSearcher(<span class="str">"SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'"</span>);
    ManagementObjectCollection MOC = NetworkInfo.Get();
    <span class="kwrd">foreach</span> (ManagementObject mo <span class="kwrd">in</span> MOC)
    {
        var adapterAddresses = (<span class="kwrd">string</span>[])mo[<span class="str">"IPAddress"</span>];
        var adapterSubnetMasks = (<span class="kwrd">string</span>[])mo[<span class="str">"IPSubnet"</span>];

        <span class="kwrd">if</span> (adapterAddresses.Count() &gt; 0 &amp;&amp; adapterSubnetMasks.Count() &gt; 0)
        {
            <span class="kwrd">try</span>
            {
                IPAddress broadcastIpForAdapter = GetBroadcastAddress(IPAddress.Parse(adapterAddresses[0]),
                                                                      IPAddress.Parse(adapterSubnetMasks[0]));
                SendBroadcastPacketToBroadcastIp(broadcastIpForAdapter, destinationPort, content);
            }
            <span class="kwrd">catch</span> (Exception ex)
            {
                Debug.WriteLine(ex.ToString());
            }
        }
    }
}

<span class="kwrd">private</span> <span class="kwrd">static</span> IPAddress GetBroadcastAddress(IPAddress ipAddress, IPAddress subnetMask)
{
    <span class="kwrd">byte</span>[] ipAdressBytes = ipAddress.GetAddressBytes();
    <span class="kwrd">byte</span>[] subnetMaskBytes = subnetMask.GetAddressBytes();
    <span class="kwrd">if</span> (ipAdressBytes.Length != subnetMaskBytes.Length)
        <span class="kwrd">throw</span> <span class="kwrd">new</span> ArgumentException(<span class="str">"Both IP address and subnet mask should be of the same length"</span>);
    var result = <span class="kwrd">new</span> <span class="kwrd">byte</span>[ipAdressBytes.Length];
    <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt; result.Length; i++)
        result[i] = (<span class="kwrd">byte</span>)(ipAdressBytes[i] | (subnetMaskBytes[i] ^ 255));
    <span class="kwrd">return</span> <span class="kwrd">new</span> IPAddress(result);
}

<span class="kwrd">private</span> <span class="kwrd">static</span> <span class="kwrd">void</span> SendBroadcastPacketToBroadcastIp(IPAddress broadcastIp, <span class="kwrd">int</span> destinationPort, <span class="kwrd">byte</span>[] content)
{
    Socket sock = <span class="kwrd">null</span>;
    <span class="kwrd">try</span>
    {
        var destinationEndpoint = <span class="kwrd">new</span> IPEndPoint(broadcastIp, destinationPort);
        sock = <span class="kwrd">new</span> Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
        sock.SendTo(content, destinationEndpoint);
    }
    <span class="kwrd">finally</span>
    {
        <span class="kwrd">if</span> (sock != <span class="kwrd">null</span>)
        {
            sock.Close();
        }
    }
}</pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</div>
<p><br /><br />---<br />
<a href="https://www.amazon.de/?&tag=fabsenetfabse-21">Unterst&uuml;tze mich und meinen Blog und kauf dir was Nettes (&uuml;ber diesen Link)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabse.net/2008/10/29/udp-broadcasts-mit-csharp-versenden-extended/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

