<?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>Meandering thoughts &#187; ECO</title>
	<atom:link href="http://magpie.sytes.net/jesperhogstrom/category/eco/feed/" rel="self" type="application/rss+xml" />
	<link>http://magpie.sytes.net/jesperhogstrom</link>
	<description>Words are flying out like endless rain into a paper cup.</description>
	<lastBuildDate>Fri, 16 Oct 2009 23:06:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Nested foreach in ECO report generator</title>
		<link>http://magpie.sytes.net/jesperhogstrom/2008/12/nested-foreach-in-eco-report-generator/</link>
		<comments>http://magpie.sytes.net/jesperhogstrom/2008/12/nested-foreach-in-eco-report-generator/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 21:56:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[ECO]]></category>

		<guid isPermaLink="false">http://magpie.sytes.net/jesperhogstrom/?p=154</guid>
		<description><![CDATA[As Jonas pointed out in a comment to my last post, it was not possible to nest foreach-loops in the report.
One minor change was required to support that, namely the locating of the position of the &#8211; matching &#8211; {/foreach}.
Original code looked like:



if &#40;toExpand.StartsWith&#40;startForeach&#41;&#41;


&#123;


&#160; endPos = s.IndexOf&#40;endForeach, endPos&#41;; &#160; // &#60;&#8211; This line finds the [...]]]></description>
			<content:encoded><![CDATA[<p>As Jonas pointed out in a comment to <a href="/jesperhogstrom/2008/12/simple-report-generator-for-eco/">my last post</a>, it was not possible to nest foreach-loops in the report.</p>
<p>One minor change was required to support that, namely the locating of the position of the &#8211; matching &#8211; {/foreach}.</p>
<p>Original code looked like:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>toExpand.<span class="me1">StartsWith</span><span class="br0">&#40;</span>startForeach<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; endPos = s.<span class="me1">IndexOf</span><span class="br0">&#40;</span>endForeach, endPos<span class="br0">&#41;</span>; &nbsp; <span class="co1">// &lt;&#8211; This line finds the next {/foreach} &#8211; not the matching one</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">string</span> repeatBlock = s.<span class="me1">Substring</span><span class="br0">&#40;</span>i + toExpand.<span class="me1">Length</span> + <span class="nu0">2</span>, endPos &#8211; i &#8211; toExpand.<span class="me1">Length</span> &#8211; <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; expanded.<span class="me1">Append</span><span class="br0">&#40;</span>ExpandBlock<span class="br0">&#40;</span>roots, toExpand, repeatBlock<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; i += toExpand.<span class="me1">Length</span> + repeatBlock.<span class="me1">Length</span> + endForeach.<span class="me1">Length</span> + <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">break</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Instead, that has to change to</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span>toExpand.<span class="me1">StartsWith</span><span class="br0">&#40;</span>startForeach<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; endPos = GetMatchingEndPos<span class="br0">&#40;</span>s, endPos<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>endPos == <span class="nu0">-1</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; throw new InvalidOperationException<span class="br0">&#40;</span><span class="kw4">string</span>.<span class="me1">Format</span><span class="br0">&#40;</span><span class="st0">&quot;Unable to find matching /foreach after start on pos {0}&quot;</span>, i<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">string</span> repeatBlock = s.<span class="me1">Substring</span><span class="br0">&#40;</span>i + toExpand.<span class="me1">Length</span> + <span class="nu0">2</span>, endPos &#8211; i &#8211; toExpand.<span class="me1">Length</span> &#8211; <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; expanded.<span class="me1">Append</span><span class="br0">&#40;</span>ExpandBlock<span class="br0">&#40;</span>roots, toExpand, repeatBlock<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; i += toExpand.<span class="me1">Length</span> + repeatBlock.<span class="me1">Length</span> + endForeach.<span class="me1">Length</span> + <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">break</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Again, interesting lines of code somewhere else (the method was already way too long for my taste anyway!}</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">private <span class="kw4">int</span> GetMatchingEndPos<span class="br0">&#40;</span><span class="kw4">string</span> s, <span class="kw4">int</span> startPos<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">int</span> result;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">int</span> openCount = <span class="nu0">1</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw1">do</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; result = s.<span class="me1">IndexOf</span><span class="br0">&#40;</span>endForeach, startPos<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> nextOpen = s.<span class="me1">IndexOf</span><span class="br0">&#40;</span>startForeach, startPos<span class="br0">&#41;</span>; </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>nextOpen == <span class="nu0">-1</span> || nextOpen &gt; result<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; openCount&#8211;;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; startPos = result + <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; openCount++;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; startPos = nextOpen + <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#125;</span> <span class="kw1">while</span> <span class="br0">&#40;</span>openCount &gt; <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> result;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>What the code does is look for the next open and close token. If the first token is &#8220;open&#8221;, increase the openCount. If the next token is &#8220;close&#8221;, decrease openCount. Next time, start looking after the first token found. If the openCount is zero, we&#8217;ve found ourselves a match.</p>
<p>This can be tested with template strings like</p>
<pre>{foreach:Person.allInstances}
  outer {Person:self.fullName}
  {foreach:Person.allInstances}
  inner {Person:self.fullName}
  {/foreach}
  {foreach:Person.allInstances}
  inner2 {Person:self.fullName}
  {/foreach}
{/foreach}</pre>
<p>i.e. a sequence of &#8220;start start stop start stop stop&#8221;. The sequences I alread had works fine still, as well as &#8220;start start stop stop&#8221;. Should be pretty safe.</p>
<p>&#8211;Jesper Hogstrom</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fmagpie.sytes.net%2Fjesperhogstrom%2F2008%2F12%2Fnested-foreach-in-eco-report-generator%2F&amp;linkname=Nested%20foreach%20in%20ECO%20report%20generator"><img src="http://magpie.sytes.net/jesperhogstrom/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://magpie.sytes.net/jesperhogstrom/2008/12/nested-foreach-in-eco-report-generator/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Simple report generator for ECO</title>
		<link>http://magpie.sytes.net/jesperhogstrom/2008/12/simple-report-generator-for-eco/</link>
		<comments>http://magpie.sytes.net/jesperhogstrom/2008/12/simple-report-generator-for-eco/#comments</comments>
		<pubDate>Tue, 16 Dec 2008 21:38:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[ECO]]></category>

		<guid isPermaLink="false">http://magpie.sytes.net/jesperhogstrom/?p=149</guid>
		<description><![CDATA[Ever so often customers want things printed. It may be a recepit, a complex report, an inventory list or just a page about the customer object being viewed.
Thus I found myself volonteering to write a library system (simple book lending and returning) for a friend. I had implemented the most critical parts of the system [...]]]></description>
			<content:encoded><![CDATA[<p>Ever so often customers want things printed. It may be a recepit, a complex report, an inventory list or just a page about the customer object being viewed.</p>
<p>Thus I found myself volonteering to write a library system (simple book lending and returning) for a friend. I had implemented the most critical parts of the system (lending and returning) when I realized the current system they have print a lending receipt and a return receipt. So, rather than learning everything there is to know about printing and pixel adjustments of labels I decided to cheat just a little bit.</p>
<p>My first realization was that if I could generate a html-file with the required information, I could rely on a browser to render and print the receipts. That simple thought reduced the problem to how to generate the html-file.</p>
<p>My second idea was that instead of generating the full html-file, I would be better off expanding a html template. That way the system is future proof in the sense that a change in the layout of the printed stuff does not require programming, merely updating the template.</p>
<p>Now the problem is reduced to data driven template expansion.</p>
<p>Using <a href="http://capableobjects.com">ECO</a> this should be a no-brainer, given the ability to use OCL to query the object layer without having to worry about fetching information from a storage backend.</p>
<p>I set out to write a general purpose expansion service with an interface initially looking like the following.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">public interface IExpansionService</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">string</span> Expand<span class="br0">&#40;</span>IElement<span class="br0">&#91;</span><span class="br0">&#93;</span> roots, <span class="kw4">string</span> s<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Simplistic, yes, but it can easily be expanded to cover a few more bases.</p>
<p>Then I pondered an expansion language. As can be guess from the interface, I would like to be able to pass several objects that can serve as root elements when evaluating OCL.</p>
<p>I finally settled for the following:</p>
<div>
<pre>Hello {Person:self.firstName}!

You have purchased the following items:

{foreach:Invoice:self.invoiceItems}

* {Product:self.quantity} pieces of {InvoiceItem:self..Product.Name}

{/foreach}</pre>
<p>(Add html elements as you please)</p></div>
<p>The things I need to parse are expressions within curly brackets. What is inside curly brackets are either:</p>
<div>* typename colon expression &#8211; must yield a string* &#8220;foreach&#8221; colon typename colon expression &#8211; must yield a collection</p>
<p>* &#8220;/foreach&#8221;</p></div>
<p>First, add a method to implement the interface.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">public <span class="kw4">string</span> Expand<span class="br0">&#40;</span>IElement<span class="br0">&#91;</span><span class="br0">&#93;</span> roots, <span class="kw4">string</span> s<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> ExpansionCore<span class="br0">&#40;</span>roots, s<span class="br0">&#41;</span>.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>It&#8217;s pretty clear  that I&#8217;ve hidden all the goodies in ExpansionCore.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">private StringBuilder ExpansionCore<span class="br0">&#40;</span>IElement<span class="br0">&#91;</span><span class="br0">&#93;</span> roots, <span class="kw4">string</span> s<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">string</span> startForeach = <span class="st0">&quot;foreach:&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">string</span> endForeach = <span class="st0">&quot;{/foreach}&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; StringBuilder expanded = new StringBuilder<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i = <span class="nu0">0</span>; i &lt; s.<span class="me1">Length</span>; i++<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">char</span> c = s<span class="br0">&#91;</span>i<span class="br0">&#93;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span>c<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#8216;<span class="es0">\\</span>&#8216;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; expanded.<span class="me1">Append</span><span class="br0">&#40;</span>s<span class="br0">&#91;</span>++i<span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>; &nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#8216;{&#8217;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> endPos = s.<span class="me1">IndexOf</span><span class="br0">&#40;</span><span class="st0">&#8216;}&#8217;</span>, i<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">string</span> toExpand = s.<span class="me1">Substring</span><span class="br0">&#40;</span>i + <span class="nu0">1</span>, endPos &#8211; i &#8211; <span class="nu0">1</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>toExpand.<span class="me1">StartsWith</span><span class="br0">&#40;</span>startForeach<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; endPos = s.<span class="me1">IndexOf</span><span class="br0">&#40;</span>endForeach, endPos<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">string</span> repeatBlock = s.<span class="me1">Substring</span><span class="br0">&#40;</span>i + toExpand.<span class="me1">Length</span> + <span class="nu0">2</span>, endPos &#8211; i &#8211; toExpand.<span class="me1">Length</span> &#8211; <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; expanded.<span class="me1">Append</span><span class="br0">&#40;</span>ExpandBlock<span class="br0">&#40;</span>roots, toExpand, repeatBlock<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i += toExpand.<span class="me1">Length</span> + repeatBlock.<span class="me1">Length</span> + endForeach.<span class="me1">Length</span> + <span class="nu0">1</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; i += toExpand.<span class="me1">Length</span> + <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; expanded.<span class="me1">Append</span><span class="br0">&#40;</span>ExpandString<span class="br0">&#40;</span>roots, toExpand<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">default</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; expanded.<span class="me1">Append</span><span class="br0">&#40;</span>c<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> expanded;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The special handling of back-slash allows the escaping of curly brackets. It also means back-slashes must be escaped.</p>
<p>If the upcoming character is an opening bracket, then simply find the closing bracket. If the string in between starts with &#8220;foreach&#8221; we handle it in ExpandBlock. Otherwise the string is expanded using ExpandString.</p>
<p>ExpandString doesn&#8217;t need to do much, really.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">private <span class="kw4">string</span> ExpandString<span class="br0">&#40;</span>IElement<span class="br0">&#91;</span><span class="br0">&#93;</span> roots, <span class="kw4">string</span> toExpand<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> EvaluateExpression<span class="br0">&#40;</span>roots, toExpand<span class="br0">&#41;</span>.<span class="me1">GetValue</span>&lt;string&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Again, interesting bits are elsewhere. Let&#8217;s take a peek at EvaluateExpression.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">private IElement EvaluateExpression<span class="br0">&#40;</span>IElement<span class="br0">&#91;</span><span class="br0">&#93;</span> roots, <span class="kw4">string</span> toExpand<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; var ocl = ServiceProvider.<span class="me1">GetEcoService</span>&lt;IOclService&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">string</span><span class="br0">&#91;</span><span class="br0">&#93;</span> parts = toExpand.<span class="me1">Split</span><span class="br0">&#40;</span>new <span class="kw4">char</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span> <span class="st0">&#8216;:&#8217;</span> <span class="br0">&#125;</span>, <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw4">string</span> expression = toExpand.<span class="me1">Trim</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; IElement root = <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>parts.<span class="me1">Length</span> == <span class="nu0">2</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; root = GetRootElement<span class="br0">&#40;</span>parts<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="me1">Trim</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, roots<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; expression = parts<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>.<span class="me1">Trim</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> ocl.<span class="me1">Evaluate</span><span class="br0">&#40;</span>root, expression<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Here we see that the string toExpand is split at the colon. If the resulting array is of length 1, then we didn&#8217;t specify a root type, and we simply use no root. That is perfectly ok for expressions like &#8220;Color.allinstances-&gt;first.colorname&#8221;.</p>
<p>Thanks to the OclService in ECO there is no need to worry about how to actually evaluate the string. Just get the service and invoke Evaluate. Before I forget, I passed an IEcoServiceProvider to the constructor of my ExpansionService.</p>
<p>There is one interesting bit left in EvaluateExpression &#8211; GetRootElement.</p>
<p>What I wanted was to specify the type by modeled name, and then match that against the  modeled names of the elements in the submitted IElement[] roots.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">private IElement GetRootElement<span class="br0">&#40;</span><span class="kw4">string</span> typename, IElement<span class="br0">&#91;</span><span class="br0">&#93;</span> roots<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">string</span><span class="br0">&#91;</span><span class="br0">&#93;</span> nameparts = typename.<span class="me1">Split</span><span class="br0">&#40;</span>new <span class="kw4">char</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span> <span class="st0">&#8216;['</span>, <span class="st0">']&#8216;</span> <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">int</span> rootIndex = <span class="nu0">0</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>nameparts.<span class="me1">Length</span> &gt; <span class="nu0">1</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; typename = nameparts<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="me1">Trim</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; rootIndex = <span class="kw4">int</span>.<span class="me1">Parse</span><span class="br0">&#40;</span>nameparts<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>.<span class="me1">Trim</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw4">int</span> scanCount = <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; foreach <span class="br0">&#40;</span>var element in roots<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>element.<span class="me1">UmlType</span>.<span class="me1">Name</span>.<span class="me1">Equals</span><span class="br0">&#40;</span>typename, StringComparison.<span class="me1">InvariantCultureIgnoreCase</span><span class="br0">&#41;</span> &amp;amp;&amp;amp; <span class="br0">&#40;</span>scanCount++ == rootIndex<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> element;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Again, I have deviated from the grammar specification. As you may or may not realize the type name can be followed by an index in hard brackets. If the index is left out, the first match is used. The rationale for this is that I might want to pass in two root elements of the same type, so there must be a way to select the first or the second of them.</p>
<p>The only part left to investigate is the ExpandBlock method.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">private <span class="kw4">string</span> ExpandBlock<span class="br0">&#40;</span>IElement<span class="br0">&#91;</span><span class="br0">&#93;</span> roots, <span class="kw4">string</span> toExpand, <span class="kw4">string</span> repeatBlock<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; StringBuilder result = new StringBuilder<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; IElementCollection list = EvaluateExpression<span class="br0">&#40;</span>roots, toExpand.<span class="me1">Substring</span><span class="br0">&#40;</span>toExpand.<span class="me1">IndexOf</span><span class="br0">&#40;</span><span class="st0">&#8216;:&#8217;</span><span class="br0">&#41;</span> + <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">GetAsCollection</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; foreach <span class="br0">&#40;</span>IElement element in list<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; List&lt;IElement&gt; newRoots = new List&lt;IElement&gt;<span class="br0">&#40;</span>roots<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; newRoots.<span class="me1">Insert</span><span class="br0">&#40;</span><span class="nu0">0</span>, element<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; result.<span class="me1">Append</span><span class="br0">&#40;</span>Expand<span class="br0">&#40;</span>newRoots.<span class="me1">ToArray</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, repeatBlock<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> result.<span class="me1">ToString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Given the neat partitioning of the code above, there&#8217;s not much required to expand the block.</p>
<p>First, evaluate the expression into an IElementCollection.</p>
<p>Then iterate over the collection and build a new IElement-array with the current element added as the first root element.</p>
<p>Finally use the new root array and expand the block using the Expand method.</p>
<p>Test it by something like:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">Person p1 = new Person<span class="br0">&#40;</span>EcoSpace<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">p1.<span class="me1">firstName</span> = <span class="st0">&quot;Wolfgang&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">Person p2 = new Person<span class="br0">&#40;</span>EcoSpace<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">p2.<span class="me1">firstName</span> = <span class="st0">&quot;Amadeus&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">MessageBox.<span class="me1">Show</span><span class="br0">&#40;</span>EcoSpace.<span class="me1">ExpansionService</span>.<span class="me1">Expand</span><span class="br0">&#40;</span>new IElement<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span> p1.<span class="me1">AsIObject</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, p2.<span class="me1">AsIObject</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#125;</span>, <span class="st0">&quot;First we have {Person:firstName} and then of course  {Person[1]:firstName}&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Such nifty code requires the service to be registered and exposed as a property:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">public EcoProject1EcoSpace<span class="br0">&#40;</span><span class="br0">&#41;</span>: base<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; InitializeComponent<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; this.<span class="me1">RegisterEcoService</span><span class="br0">&#40;</span>typeof<span class="br0">&#40;</span>IExpansionService<span class="br0">&#41;</span>, new ExpansionService<span class="br0">&#40;</span>this<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">public IExpansionService ExpansionService <span class="br0">&#123;</span> get <span class="br0">&#123;</span> <span class="kw1">return</span> GetEcoService&lt;IExpansionService&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="br0">&#125;</span> <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>It is pefrectly possible to reach this service from anywhere in your application where an IEcoServiceProvider is available. Notably inside your business methods.</p>
<p>I rapidly enhanced my interface slightly to look like</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">public interface IExpansionService</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">string</span> Expand<span class="br0">&#40;</span>IElement<span class="br0">&#91;</span><span class="br0">&#93;</span> roots, <span class="kw4">string</span> s<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">string</span> Expand<span class="br0">&#40;</span>IObjectProvider<span class="br0">&#91;</span><span class="br0">&#93;</span> roots, <span class="kw4">string</span> s<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw4">string</span> ExpandFile<span class="br0">&#40;</span>IElement<span class="br0">&#91;</span><span class="br0">&#93;</span> roots, <span class="kw4">string</span> fileName<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">void</span> ExpandTemplateIntoFile<span class="br0">&#40;</span>IElement<span class="br0">&#91;</span><span class="br0">&#93;</span> roots, <span class="kw4">string</span> templateName, <span class="kw4">string</span> targetName<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Most of the additional functionality os trivial to implement. The overload that takes an array of IObjectProvider allows calls to shorten ever so slightly:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">MessageBox.<span class="me1">Show</span><span class="br0">&#40;</span>EcoSpace.<span class="me1">ExpansionService</span>.<span class="me1">Expand</span><span class="br0">&#40;</span>new IObjectProvider<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span> p1, p2 <span class="br0">&#125;</span>, <span class="st0">&quot;First we have {Person:firstName} and then of course  {Person[1]:firstName}&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>In the name of reuse, I chose the following implementation for the second Expand.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">public <span class="kw4">string</span> Expand<span class="br0">&#40;</span>IObjectProvider<span class="br0">&#91;</span><span class="br0">&#93;</span> roots, <span class="kw4">string</span> s<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> Expand<span class="br0">&#40;</span>IElementArray<span class="br0">&#40;</span>roots<span class="br0">&#41;</span>, s<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">private IElement<span class="br0">&#91;</span><span class="br0">&#93;</span> IElementArray<span class="br0">&#40;</span>IObjectProvider<span class="br0">&#91;</span><span class="br0">&#93;</span> roots<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; List&lt;IElement&gt; result = new List&lt;IElement&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; foreach <span class="br0">&#40;</span>var item in roots<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; result.<span class="me1">Add</span><span class="br0">&#40;</span>item.<span class="me1">AsIObject</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> result.<span class="me1">ToArray</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>..figuring I probably want to overload the other interface methods too at some point in the future.</p>
<p>Here&#8217;s how my Print method looks on one of my business objects.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">public <span class="kw4">void</span> Print<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">string</span> fileName = Environment.<span class="me1">GetFolderPath</span><span class="br0">&#40;</span>Environment.<span class="me1">SpecialFolder</span>.<span class="me1">Personal</span><span class="br0">&#41;</span> + Path.<span class="me1">DirectorySeparatorChar</span> + &nbsp;<span class="st0">&quot;temp.html&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>File.<span class="me1">Exists</span><span class="br0">&#40;</span>fileName<span class="br0">&#41;</span><span class="br0">&#41;</span> File.<span class="me1">Delete</span><span class="br0">&#40;</span>fileName<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; AsIObject<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">ServiceProvider</span>.<span class="me1">GetEcoService</span>&lt;IExpansionService&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">ExpandTemplateIntoFile</span><span class="br0">&#40;</span>new IElement<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#123;</span> this.<span class="me1">AsIObject</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#125;</span>, <span class="st0">&quot;receipt.html&quot;</span>, fileName<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; ProcessStartInfo pstart = new ProcessStartInfo<span class="br0">&#40;</span><span class="st0">&quot;RUNDLL32.EXE&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; pstart.<span class="me1">Arguments</span> = <span class="kw4">string</span>.<span class="me1">Format</span><span class="br0">&#40;</span><span class="st0">&quot;MSHTML.DLL,PrintHTML <span class="es0">\&quot;</span>{0}<span class="es0">\&quot;</span>&quot;</span>, fileName<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; Process.<span class="me1">Start</span><span class="br0">&#40;</span>pstart<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>I got the details on how to print rendered html-files from <a href="http://www.robvanderwoude.com/printfiles.html#PrintHTM">http://www.robvanderwoude.com/printfiles.html#PrintHTM</a>.</p>
<p>The above should give you enough to handle most of the every-day style printing efforts that your users want to do. There are no doubt countless ways code can be improved and made more generic, and I hope to hear from you how you have enhanced the basic idea.</p>
<p><strong>Update:</strong> To support nested foreach-blocks, please refer to <a href="/jesperhogstrom/2008/12/nested-foreach-in-eco-report-generator/">this post</a>.</p>
<p>&#8211;Jesper Hogstrom</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fmagpie.sytes.net%2Fjesperhogstrom%2F2008%2F12%2Fsimple-report-generator-for-eco%2F&amp;linkname=Simple%20report%20generator%20for%20ECO"><img src="http://magpie.sytes.net/jesperhogstrom/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://magpie.sytes.net/jesperhogstrom/2008/12/simple-report-generator-for-eco/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Reusing icons in a winforms app using eco service mechanism</title>
		<link>http://magpie.sytes.net/jesperhogstrom/2008/12/reusing-icons-in-a-winforms-app-using-eco-service-mechanism/</link>
		<comments>http://magpie.sytes.net/jesperhogstrom/2008/12/reusing-icons-in-a-winforms-app-using-eco-service-mechanism/#comments</comments>
		<pubDate>Sun, 14 Dec 2008 20:46:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[ECO]]></category>

		<guid isPermaLink="false">http://magpie.sytes.net/jesperhogstrom/?p=144</guid>
		<description><![CDATA[Windows.Forms may not be the hottest technology these days, but it&#8217;s a convenient platform to write to.
I&#8217;m currently writing an app for a friend using good ol&#8217;  windows forms. There&#8217;s one &#8220;main form&#8221; and then several forms for data entry, searching, data maintenance and so on. All, or at least most, of these forms have [...]]]></description>
			<content:encoded><![CDATA[<p>Windows.Forms may not be the hottest technology these days, but it&#8217;s a convenient platform to write to.</p>
<p>I&#8217;m currently writing an app for a friend using good ol&#8217;  windows forms. There&#8217;s one &#8220;main form&#8221; and then several forms for data entry, searching, data maintenance and so on. All, or at least most, of these forms have the same icon. For one thing &#8211; what if the icon I selected isn&#8217;t what my customer expected? Another thing is the resources used to store multiple copies of the icon. Not a whole lot, but still.</p>
<p>What I would want to do is set the icon on the main form and have all the other forms pick it up.  Now, there is no concept of main form, though one could probably make a reasonable guess from Application.OpenForms. However, I deceided not to investigate that avenue further, and instead define a service like</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">public interface IIconService</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">void</span> RegisterIcon<span class="br0">&#40;</span>Form f<span class="br0">&#41;</span>; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="kw4">void</span> SetIcon<span class="br0">&#40;</span>Form f<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>I implemented that in a very simple way as</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">public class IconService : IIconService</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; private Icon icon;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; public <span class="kw4">void</span> RegisterIcon<span class="br0">&#40;</span>Form f<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; icon = f.<span class="me1">Icon</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; public <span class="kw4">void</span> SetIcon<span class="br0">&#40;</span>Form f<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; f.<span class="me1">Icon</span> = icon;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Using the service mechanisms available in <a href="http://capableobjects.com/">Enterprise Core Objects</a> (ECO) it&#8217;s possible to install the service</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">public EcoProject1EcoSpace<span class="br0">&#40;</span><span class="br0">&#41;</span>: base<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; InitializeComponent<span class="br0">&#40;</span><span class="br0">&#41;</span>; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; this.<span class="me1">RegisterEcoService</span><span class="br0">&#40;</span>typeof<span class="br0">&#40;</span>IIconService<span class="br0">&#41;</span>, new IconService<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>and make ita property of the ecospace</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">public IIconService IconService <span class="br0">&#123;</span> get <span class="br0">&#123;</span> <span class="kw1">return</span> GetEcoService&lt;IIconService&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="br0">&#125;</span> <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>In the constructor of the main form, register the main form&#8217;s icon.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">public MainForm<span class="br0">&#40;</span>EcoProject1.<span class="me1">EcoProject1EcoSpace</span> ecoSpace<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; InitializeComponent<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; rhRoot.<span class="me1">EcoSpace</span> = ecoSpace; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; ecoSpace.<span class="me1">IconService</span>.<span class="me1">RegisterIcon</span><span class="br0">&#40;</span>this<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>In the constructor of the other forms, set the icon.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">private frmSearchPersons<span class="br0">&#40;</span>EcoProject1.<span class="me1">EcoProject1EcoSpace</span> ecoSpace<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; InitializeComponent<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; rhRoot.<span class="me1">EcoSpace</span> = ecoSpace;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; ecoSpace.<span class="me1">IconService</span>.<span class="me1">SetIcon</span><span class="br0">&#40;</span>this<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Now, when changing the icon of the main form, it will ripple through to all the other forms, and we&#8217;ve shaved off a kB for each form in the application using the same icon.</p>
<p>&#8211;Jesper Hogstrom</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fmagpie.sytes.net%2Fjesperhogstrom%2F2008%2F12%2Freusing-icons-in-a-winforms-app-using-eco-service-mechanism%2F&amp;linkname=Reusing%20icons%20in%20a%20winforms%20app%20using%20eco%20service%20mechanism"><img src="http://magpie.sytes.net/jesperhogstrom/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://magpie.sytes.net/jesperhogstrom/2008/12/reusing-icons-in-a-winforms-app-using-eco-service-mechanism/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What&#8217;s with Enterprise Core Objects?</title>
		<link>http://magpie.sytes.net/jesperhogstrom/2008/12/whats-with-enterprise-core-objects/</link>
		<comments>http://magpie.sytes.net/jesperhogstrom/2008/12/whats-with-enterprise-core-objects/#comments</comments>
		<pubDate>Sat, 13 Dec 2008 10:58:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ECO]]></category>
		<category><![CDATA[personligt]]></category>

		<guid isPermaLink="false">http://magpie.sytes.net/jesperhogstrom/?p=139</guid>
		<description><![CDATA[My last post was about writing code for Enterprise Core Objects, ECO.
As I intend to write more about ECO, I might as well give you the full story.
Way back when, in 1997, thanks to a series of improbable events I teamed up with Jan Norden, chief architect of Boldsoft and Henrik Jondell, CEO of Boldsoft [...]]]></description>
			<content:encoded><![CDATA[<p>My <a href="/jesperhogstrom/2008/12/eco-and-custom-services/">last post</a> was about writing code for <a href="http://capableobjects.com/">Enterprise Core Objects</a>, ECO.</p>
<p>As I intend to write more about ECO, I might as well give you the full story.</p>
<p>Way back when, in 1997, thanks to a series of improbable events I teamed up with Jan Norden, chief architect of Boldsoft and Henrik Jondell, CEO of Boldsoft to write a product called Bold for Delphi. During the next years we expanded the team to include amongst others Jonas Hogstrom (my brother) and we had great fun writing code and doing consultancy work for clients like the Swedish Government, the National Television Broardcast Corporation (SvT), the Swedish Armed Forces and others.</p>
<p>In 2002 we were hired as a team by Borland. We converted <a href="http://dn.codegear.com/article/33058">Bold for Delphi</a>, a win32 product, to what would eventually become Enterprise Core Objects, a .Net product.</p>
<p>Late 2006 Borland decided to simplify their organization (or something &#8211; I was not privy to the discussions in the fancy corner of the C-level corridor) and terminated the Swedish development center, i.e. the ECO team was set free.</p>
<p>The team decided to continue work on the ECO code base and formed Capable Objects AB. Obviously this was done in friendly negotiations with Borland &#8211; simply stealing the code base was not an option <img src='http://magpie.sytes.net/jesperhogstrom/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>As time passed I decided to set my mind to something different and let the others continue the development of what is arguably the best model driven development platform on the planet.</p>
<p>However, despite having a day-time job in a slightly different area of the computer industry I still very much enjoy the concepts and programming model of ECO. Thus, I write the odd application or cobble together some proof of concept code in ECO. It&#8217;s those efforts that I have and will blog about.</p>
<p>My current relation to CapableObjects is such that I have no involvement in the daily operations or code cutting, but I do help out with (and host some of) their computer infrastructure and love to give feedback on the product and meet the guys for a beer or two. I still enjoy the benefit of having an email address on the capableobjects.com domain.</p>
<p>With that I consider the full disclosure as presented.</p>
<p>&#8211;Jesper Högström</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fmagpie.sytes.net%2Fjesperhogstrom%2F2008%2F12%2Fwhats-with-enterprise-core-objects%2F&amp;linkname=What%26%238217%3Bs%20with%20Enterprise%20Core%20Objects%3F"><img src="http://magpie.sytes.net/jesperhogstrom/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://magpie.sytes.net/jesperhogstrom/2008/12/whats-with-enterprise-core-objects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ECO and custom services</title>
		<link>http://magpie.sytes.net/jesperhogstrom/2008/12/eco-and-custom-services/</link>
		<comments>http://magpie.sytes.net/jesperhogstrom/2008/12/eco-and-custom-services/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 20:16:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[ECO]]></category>

		<guid isPermaLink="false">http://magpie.sytes.net/jesperhogstrom/?p=127</guid>
		<description><![CDATA[As you are well aware, ECO is heavily modularized by use of services.
You have surely noticed that when getting an eco service with code similar to



var ocl = ServiceProvider.GetEcoService&#60;IOclService&#62;&#40;&#41;;



As things have matured, the DefaultEcoSpace now implements simple properties for the more common built-in services;



// Summary:


//     The IVariableFactoryService of the EcoSpace


//


// Remarks:


//     The IVariableFactoryService contains methods [...]]]></description>
			<content:encoded><![CDATA[<p>As you are well aware, <a href="http://capableobjects.com/">ECO</a> is heavily modularized by use of services.</p>
<p>You have surely noticed that when getting an eco service with code similar to</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">var ocl = ServiceProvider.<span class="me1">GetEcoService</span>&lt;IOclService&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>As things have matured, the DefaultEcoSpace now implements simple properties for the more common built-in services;</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// Summary:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//     The IVariableFactoryService of the EcoSpace</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Remarks:</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">//     The IVariableFactoryService contains methods for creating free standing ECO</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//     elements that can be used as variables. The elements returned will implement</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//     IElement, and any other applicable interfaces from the Eco.ObjectRepresentation</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//     namespace.  This propery is equivalent to retieving the IVariableFactoryService</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//     from an IEcoServiceProvider using GetEcoService(typeof(IVariableFactoryService)).</span></div>
</li>
<li class="li2">
<div class="de2">public IVariableFactoryService VariableFactory <span class="br0">&#123;</span> get; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// Summary:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//     The IVersionService of the EcoSpace</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// Remarks:</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//     The IVersionService is used for accessing historical values of ECO objects.</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//      This propery is equivalent to retieving the IVersionService from an IEcoServiceProvider</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//     using GetEcoService(typeof(IVersionService)).</span></div>
</li>
<li class="li1">
<div class="de1">public IVersionService Versioning <span class="br0">&#123;</span> get; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>and quite a few more.</p>
<p>What is not obvious at first glance is that anyone can register a service by means of the method DefaultEcoSpace.RegisterEcoService(Type type, object instance). As with any other service, the services you register are available from any service provider in which they are registered.</p>
<p>Here&#8217;s an idea I probably got from <a href="http://mrpmorris.blogspot.com/">Peter Morris</a>; add your own ICurrentUserService.</p>
<p>The idea is to have a globally available service that can tell you who &#8211; if anyone &#8211; is logged in.</p>
<p>My suggestion for an interface looks like:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">public interface IUserService&lt;T&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; bool Login<span class="br0">&#40;</span><span class="kw4">string</span> userName, <span class="kw4">string</span> password<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw4">void</span> Logout<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; T CurrentUser <span class="br0">&#123;</span> get; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; bool IsLoggedIn <span class="br0">&#123;</span> get; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The reason for a generic interface is to avoid linking it to the specific model.</p>
<p>The implementation is fairly straight forward. Note that there is a hard coded OCL expression that may or may not be suitable for you. It&#8217;s easy to change that to be set by a parameter. One of those famous exercises for the reader.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">public class CurrentUserService&lt;T&gt;: IUserService&lt;T&gt;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;private IEcoServiceProvider ServiceProvider <span class="br0">&#123;</span> get; set; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;public CurrentUserService <span class="br0">&#40;</span>IEcoServiceProvider serviceProvider<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;ServiceProvider = serviceProvider;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;public bool Login<span class="br0">&#40;</span><span class="kw4">string</span> userName, <span class="kw4">string</span> password<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp;var variables = ServiceProvider.<span class="me1">GetEcoService</span>&lt;IVariableFactoryService&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">CreateVariableList</span><span class="br0">&#40;</span><span class="st0">&quot;var_username&quot;</span>, &nbsp;userName<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;variables.<span class="me1">AddConstant</span><span class="br0">&#40;</span><span class="st0">&quot;var_password&quot;</span>, password<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;var ocl = ServiceProvider.<span class="me1">GetEcoService</span>&lt;IOclService&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;IList&lt;T&gt; users = ocl.<span class="me1">Evaluate</span><span class="br0">&#40;</span><span class="st0">&quot;User.AllInstances-&gt;select((username = var_username) and (password = var_password))-&gt;First&quot;</span>, variables<span class="br0">&#41;</span>.<span class="me1">GetAsIList</span>&lt;T&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span>users.<span class="me1">Count</span> == <span class="nu0">1</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;currentUser = users<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">return</span> <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp;<span class="kw1">return</span> <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;public <span class="kw4">void</span> Logout<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp;currentUser = <span class="kw1">default</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;private T currentUser;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;public T CurrentUser</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp;get</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>IsLoggedIn<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span> currentUser;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">default</span><span class="br0">&#40;</span>T<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;public bool IsLoggedIn</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;get <span class="br0">&#123;</span> <span class="kw1">return</span> ServiceProvider != <span class="kw2">null</span> &amp;amp;&amp;amp; currentUser != <span class="kw2">null</span>; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Add this to the pool of services in the constructor of your ecospace</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">public EcoProject1EcoSpace<span class="br0">&#40;</span><span class="br0">&#41;</span>: base<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; InitializeComponent<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; this.<span class="me1">RegisterEcoService</span><span class="br0">&#40;</span>typeof<span class="br0">&#40;</span>IUserService&lt;User&gt;<span class="br0">&#41;</span>, new CurrentUserService&lt;User&gt;<span class="br0">&#40;</span>this<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Make it a first class citizen by adding a property for it</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp;public IUserService UserService <span class="br0">&#123;</span> get <span class="br0">&#123;</span> <span class="kw1">return</span> GetEcoService&lt;IUserService&lt;User&gt;&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="br0">&#125;</span> <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>After that, you can login, check for current user and what you may need.</p>
<p>Here&#8217;s the OK event on my login form</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">private <span class="kw4">void</span> btnOk_Click<span class="br0">&#40;</span>object sender, EventArgs e<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; var userService = EcoSpace.<span class="me1">GetEcoService</span>&lt;IUserService&lt;User&gt;&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>!userService.<span class="me1">Login</span><span class="br0">&#40;</span>tbxUsername.<span class="me1">Text</span>, tbxPassword.<span class="me1">Text</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; DialogResult = DialogResult.<span class="me1">None</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; MessageBox.<span class="me1">Show</span><span class="br0">&#40;</span><span class="st0">&quot;Invalid user name or password.&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>I use the logged in state to block some menus on the application;</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">private <span class="kw4">void</span> mnuFile_DropDownOpening<span class="br0">&#40;</span>object sender, EventArgs e<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; mnuLogin.<span class="me1">Enabled</span> = !EcoSpace.<span class="me1">UserService</span>.<span class="me1">IsLoggedIn</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; mnuLogout.<span class="me1">Enabled</span> = EcoSpace.<span class="me1">UserService</span>.<span class="me1">IsLoggedIn</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; mnuChangePassword.<span class="me1">Enabled</span> = EcoSpace.<span class="me1">UserService</span>.<span class="me1">IsLoggedIn</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Some objects need to relate to the current user. Add that to the Created method of the class</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">public partial class SomeModeledClass</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;partial <span class="kw4">void</span> Created<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp;CreatedByUser = AsIObject<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">ServiceProvider</span>.<span class="me1">GetEcoService</span>&lt;IUserService&lt;User&gt;&gt;<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">CurrentUser</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;CreatedDate = DateTime.<span class="me1">Now</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>There are many a neat things that can be plugged in as services. I hope this gives you an idea of what is possible.</p>
<p>&#8211;Jesper Hogstrom</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fmagpie.sytes.net%2Fjesperhogstrom%2F2008%2F12%2Feco-and-custom-services%2F&amp;linkname=ECO%20and%20custom%20services"><img src="http://magpie.sytes.net/jesperhogstrom/wp-content/plugins/add-to-any/share_save_171_16.gif" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://magpie.sytes.net/jesperhogstrom/2008/12/eco-and-custom-services/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
