<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7865085071528870006</id><updated>2012-02-16T05:47:50.732-08:00</updated><title type='text'>Nigel Findlater</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://nigelfindlater.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>85</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-2030707223502154678</id><published>2012-01-27T07:28:00.000-08:00</published><updated>2012-01-27T07:28:07.772-08:00</updated><title type='text'>Using Event Loss Tables and Year Loss Tables</title><content type='html'>This leads on from the previous blog entry on probabilistic models. The platform I am working on incorporates catastrophe models that produce Event Loss Tables or ELTs. These are tables containing Events, Ground Up Loss, Ground Up Loss standard deviation, loss frequency and various other loss perspectives. These loss tables are sorted in order of increasing ground up loss giving a cumulative loss distribution. A function that fits this curve is called a cumulative distribution function or cdf. Pricing a Cat XL treaty is done by integrating the CDF. This can be made in a number of ways:&lt;br /&gt;&lt;br /&gt;The simplest way is by burning cost. This means just summing up the events taht trigger the treaty. This works very well in low layers because there are naturally more low cost events than high cost events. For high layers there may be only a few events and the accuracy is not sufficient. In these cases we can try to fit a points to a function such as Paratoo or log polynomial and then integrate the resulting function over the Cat XL layer. There are a number of problems with this approach, for example the numerical regression may give unreasonable coefficients that give unexpected results. The method that we use the most is to to sampling each loss assuming a distribution like log normal and the standard deviation and applying a burning cost. &lt;br /&gt;&lt;br /&gt;Event loss tables can become quite large but are still manageable compared to Year Loss Tables. For example it is possible to make a loss estimation of a current event by making a query based on event or combination of events in the event loss table. It is not possible to combine different ELTs of different event sets&lt;br /&gt;&lt;br /&gt;Some cat models incorporate some information over when an event occurred. This makes it possible to model clustering of events much more accurately. This has quite an impact on pricing. For example inuring treaties can be priced much more accurately. Imagine with an ELT you need to assume an average number of events in a year. There is a big difference between having an average of 2 events per year and a year loss table that says on the first year there are 0 events on the second year there are 4 events. Both have a mean of 2 events but in the first year the treaty is not touched and in the second year it can depend on the number of reinstatements.&lt;br /&gt;&lt;br /&gt;Year loss tables are event based which makes them easy to combine with other YLTs.&lt;br /&gt;&lt;br /&gt;Here are the steps needed to create a YLT from an ELT&lt;br /&gt;&lt;br /&gt;1. Decide on how long the YLT is to be based&lt;br /&gt;2. Determine an average number of events that happen in a year&lt;br /&gt;3. Use a Poison distribution with a random sample to determine how many events happen in a particular year&lt;br /&gt;(The poison distribution provides a sequence of integer numbers )&lt;br /&gt;4. Sample from the ELT randomly these events&lt;br /&gt;5. Based on the Mean Loss and STD Loss make a sample with a distribution such as a Beta or log normal to determine an actual loss using another random variable&lt;br /&gt;&lt;br /&gt;The random variables are created from seeds. For a given seed the same sequence of random numbers are generated each time the application is run. Mathematically it turns out that this is an acceptable way of sampling and it means that the resulting YLTs are not needed to be stored. This is advantageous because in order to get events in the high layers a long simulation period is needed which means the storage requirements of a YLT is much bigger than an ELT.&lt;br /&gt;&lt;br /&gt;Now let's drill into the details. Step 3 sounds very easy, make a sample random sample of a Poisson distribution. The thing is that Poisson is expressed in a formula like frequency = Function( Mean, Standard Deviation). For example in Excel it looks like POISSON(A3,$B$1,TRUE). The problem is that we need to make random samples of the number of events with a given mean and sd. To do this we need to use something called Inversion theory. There are some statistical packages that have this function built in. For example in r it looks like &lt;br /&gt;&lt;br /&gt;pois &amp;lt;- rpois(100, lambda=3)&lt;br /&gt;&lt;br /&gt;pois[1:10]&lt;br /&gt;&lt;br /&gt;[1] 1 2 3 2 2 2 3 3 6 2&lt;br /&gt;&lt;br /&gt;In C# you need to find a library to do this. I found 2 that look interesting open source projects that have these functions&lt;br /&gt;&lt;br /&gt;http://code.google.com/p/pzmath/source/checkout&lt;br /&gt;&lt;a href="http://www.alglib.net/"&gt;http://www.alglib.net/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-2030707223502154678?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/2030707223502154678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/2030707223502154678'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2012/01/using-event-loss-tables-and-year-loss.html' title='Using Event Loss Tables and Year Loss Tables'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-3729594359582458393</id><published>2012-01-16T07:05:00.000-08:00</published><updated>2012-01-16T07:05:42.926-08:00</updated><title type='text'>Introducing probablistic models</title><content type='html'>Recently I have been revisiting some mathematics. Often maths becomes very complex very quickly so here I enjoy keeping it simple.&lt;br /&gt;&lt;br /&gt;Probabilistic models consist of 3 parts&lt;br /&gt;1. A model that produces a random variable(s) X&lt;br /&gt;2. A model that creates probabilities for the random variables &lt;br /&gt;3. The sum of frequencies must add up to 1&lt;br /&gt;&lt;br /&gt;If we take the example of flipping a coin: The coin has 2 faces and these correspond to the random variable X. The values of X can be give a value such as X=1 for heads and X=2 for tails. The model would be the probability of X=1 is 0.5 and the probability of X=2 is 0.5 and the sum of these probabilities sum to 1. Then you have a coin that may not be completely round or evenly balanced meaning it may behave differently to the model.&lt;br /&gt;&lt;br /&gt;There are other types of models for example the number of people in a queue can be modeled with Poison. Mr Poison was a lawyer that studied the lengths of queues Research on the "Probability of Judgments in Criminal and Civil Matters" and build a model around this. This is a very interesting model when modeling the length of queues, It's also very useful when converting an Event loss table to a Year loss table. Here the problem is to sample the number of events that happen in a year given a mean and a standard deviation&lt;br /&gt;&lt;br /&gt;Catastrophe probabilistic models can also be broken down into these 3 components. &lt;br /&gt;1. A modeling that combines the Hazard, Vulnerability and Exposure to produce the random variable ground up loss&lt;br /&gt;2. A model that assigns a frequency for each event&lt;br /&gt;3. An event catalogue where the sum of frequencies adds up to the total length of time the catalogue is constructed for&lt;br /&gt;&lt;br /&gt;A catastrophe model is more elaborate than the coin example and comprises of the Hazard (the earthquake or the windstorm), the vulnerability (how fragile it is) and en exposure (what buildings are at risk)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-3729594359582458393?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/3729594359582458393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/3729594359582458393'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2012/01/introducing-probablistic-models.html' title='Introducing probablistic models'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-613952797605218850</id><published>2012-01-05T05:28:00.000-08:00</published><updated>2012-01-05T06:48:34.056-08:00</updated><title type='text'>Experimenting with Powershell</title><content type='html'>Command line scripts have been around for a long time. Power shell adds a powerful fluent syntax that enables a richer and more expressive way of coding our batch files. Powershell comes with Windows 7 and above as well as Windows Server 2008 R2 and above&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Here is how to start using it... The first time you start PowerShell (Under Administrative tools I selected Windows PowerShell Modules) you will get the following warning&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Windows PowerShell&lt;br /&gt;Copyright (C) 2009 Microsoft Corporation. All rights reserved.&lt;br /&gt;WARNING: File C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSDiagnostics\PSDiagnostics.psm1 cannot be loaded&lt;br /&gt;&lt;br /&gt;because the execution of scripts is disabled on this system. Please see "get-help about_signing" for more details.&lt;br /&gt;&lt;br /&gt;PS C:\Users\nfindlater&amp;gt;&lt;br /&gt;&lt;/CODE&gt;&lt;br /&gt;&lt;br /&gt;To fix this do the following steps&lt;br /&gt;&lt;br /&gt;1. Under Administrative tools select Server Manager&lt;br /&gt;2. In the tree view select Server Manager/Features&lt;br /&gt;3. Add Feature&lt;br /&gt;4. Select Windows PowerShell&lt;br /&gt;5. Next, Install&lt;br /&gt;6. under Accessories in a directory caller PowerShell&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;PoweShell basics&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Powershell respects admin rights. Certain commandlet information require elevated privileges. Meaning that if you need access to information that requires elevated privileges you need to start powershell as administrator.&lt;br /&gt;&lt;br /&gt;Here is a simple example how powershell can be used. Start notepad then execute&lt;br /&gt;&lt;br /&gt;get -process notepad &lt;br /&gt;Stop-Process&lt;br /&gt;&lt;br /&gt;This gets a list of processes named “notepad” and pipes them to a Stop-Process commandlet which has the effect of closing the notepad that you just opened.&lt;br /&gt;&lt;br /&gt;There are other ways of getting to the same information, for example&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;PS C:\Users\nfindlater&amp;gt; get-process | where { $_.ProcessName -eq 'notepad' }&lt;br /&gt;Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName&lt;br /&gt;------- ------ ----- ----- ----- ------ -- -----------&lt;br /&gt;47 2 1108 3732 61 0.20 3112 notepad&lt;br /&gt;Here’s an example using the event log&lt;br /&gt;PS C:\Users\nfindlater&amp;gt; get-eventlog -LogName application -Newest 3&lt;br /&gt;&lt;br /&gt;Index Time EntryType Source InstanceID Message&lt;br /&gt;----- ---- --------- ------ ---------- -------&lt;br /&gt;77896 Oct 04 15:14 Information Microsoft-Windows... 1 The description for Event&lt;br /&gt;77895 Oct 04 15:14 Information Desktop Window Ma... 1073750827 The Desktop Window Manager&lt;br /&gt;77894 Oct 04 15:14 Information Winlogon 1073745925 Windows license validated.&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The output from a commandlet can be formatted in various ways, here are some examples:&lt;br /&gt;&lt;br /&gt;get-process notepad &lt;br /&gt;Format-List *&lt;br /&gt;&lt;br /&gt;get-process &lt;br /&gt;Format-Table name, starttime&lt;br /&gt;&lt;br /&gt;get-process &lt;br /&gt;where-object { $_.starttime } &lt;br /&gt;Format-Table name, starttime&lt;br /&gt;For WMI calls the command “get-wmiobject win32_service” does not give much detail. But the following provides plenty of detail:&lt;br /&gt;&lt;br /&gt;get-wmiobject win32_service&lt;br /&gt;Format-list *&lt;br /&gt;&lt;br /&gt;Here are some examples of how to start applications&lt;br /&gt;&lt;br /&gt;Start-process -FilePath notepad&lt;br /&gt;Start-process -FilePath notepad -WindowStyle minimized&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;PS C:\Users\nfindlater&amp;gt; Get-EventLog application | where-object { $_.message -match 'Desk' }&lt;br /&gt;Index Time EntryType Source InstanceID Message&lt;br /&gt;----- ---- --------- ------ ---------- -------&lt;br /&gt;77895 Oct 04 15:14 Information Desktop Window Ma... 1073750827 The Desktop Window Manager was unable to start ...&lt;br /&gt;This is faster&lt;br /&gt;C:\Users\nfindlater&amp;gt; Get-EventLog application -InstanceId 1001&lt;br /&gt;&lt;br /&gt;PS C:\Users\nfindlater&amp;gt; Get-EventLog application -newest 1&lt;br /&gt;Index Time EntryType Source InstanceID Message&lt;br /&gt;----- ---- --------- ------ ---------- -------&lt;br /&gt;77897 Oct 04 16:40 Information MSSQLSERVER 1073760088 Database backed up. Database: ICW_20081001_tRI_...&lt;br /&gt;Here are some more examples using the eventlog&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS C:\Users\nfindlater&amp;gt; Get-EventLog application -newest 1 &lt;br /&gt;format-list *&lt;br /&gt;&lt;br /&gt;EventID : 18264&lt;br /&gt;MachineName : CHBByyyy.zzz.gggg.net&lt;br /&gt;Data : {88, 71, 0, 0...}&lt;br /&gt;Index : 77897&lt;br /&gt;Category : Backup&lt;br /&gt;etc&lt;br /&gt;&lt;br /&gt;&lt;/CODE&gt;&lt;br /&gt;Here are some examples with dir. &lt;br /&gt;&lt;br /&gt;Give me all files containing the string ground (Very usefull since in Windows 7 the text search function is missing)&lt;br /&gt;&lt;br /&gt;dir *.* -recurs &lt;br /&gt;select-string "ground" &lt;br /&gt;Format-List FileName&lt;br /&gt;&lt;br /&gt;Here’s a more elaborate version looking for files with “pro” in the name&lt;br /&gt;&lt;br /&gt;dir *.* -recurs &lt;br /&gt;Where-Object {$_.Name -like "*pro*"} &lt;br /&gt;select-string "ground" &lt;br /&gt;Format-List FileName&lt;br /&gt;&lt;br /&gt;dir *.* -recurs &lt;br /&gt;Where-Object {$_.Name -like "*"} &lt;br /&gt;select-string "ground" &lt;br /&gt;Format-List FileName &lt;br /&gt;Get-Unique&lt;br /&gt;&lt;br /&gt;Filename : myfile.vcxproj&lt;br /&gt;&lt;br /&gt;dir *.* -recurs &lt;br /&gt;Where-Object {$_.Name -like "*vcx*"} &lt;br /&gt;select-string "ground" &lt;br /&gt;Format-List LineNumber, Path &lt;br /&gt;Get-Unique&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;LineNumber : 64&lt;br /&gt;Path : D:\path\myfile.vcxproj&lt;br /&gt;&lt;br /&gt;Here’s an example of how to replace a string in a file&lt;br /&gt;&lt;br /&gt;(Get-Content .\File.TXT) &lt;br /&gt;ForEach-Object {$_ -REPLACE "'", """" } &lt;br /&gt;Set-Content TEST2.TXT&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here are some examples of how to read parts of text files&lt;br /&gt;&lt;br /&gt;Get-Content ".\file_test.txt" &lt;br /&gt;select -First 10&lt;br /&gt;&lt;br /&gt;Get-Content ".\file_test.txt" &lt;br /&gt;select -Last 10&lt;br /&gt;&lt;br /&gt;Get-Content ".\file_test.txt" &lt;br /&gt;select -First 3 &lt;br /&gt;select -Last 1&lt;br /&gt;&lt;br /&gt;Get-Content ".\file_test.txt" &lt;br /&gt;select -Skip 10&lt;br /&gt;&lt;br /&gt;Power Shell with SQL Server&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I found the following link that describes how to get the SQL features of powershell working&lt;br /&gt;&lt;br /&gt;http://msdn.microsoft.com/en-us/library/cc281962.aspx&lt;br /&gt;&lt;br /&gt;Basically you need to run the following script to enable sql commands to work&lt;/code&gt;&lt;br /&gt;&lt;code&gt;#&lt;br /&gt;# Add the SQL Server Provider.&lt;br /&gt;#&lt;br /&gt;$ErrorActionPreference = "Stop"&lt;br /&gt;$sqlpsreg="HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps"&lt;br /&gt;if (Get-ChildItem $sqlpsreg -ErrorAction "SilentlyContinue")&lt;br /&gt;{&lt;br /&gt;throw "SQL Server Provider for Windows PowerShell is not installed."&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;$item = Get-ItemProperty $sqlpsreg&lt;br /&gt;$sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;# Set mandatory variables for the SQL Server provider&lt;br /&gt;#&lt;br /&gt;Set-Variable -scope Global -name SqlServerMaximumChildItems -Value 0&lt;br /&gt;Set-Variable -scope Global -name SqlServerConnectionTimeout -Value 30&lt;br /&gt;Set-Variable -scope Global -name SqlServerIncludeSystemObjects -Value $false&lt;br /&gt;Set-Variable -scope Global -name SqlServerMaximumTabCompletion -Value 1000&lt;br /&gt;#&lt;br /&gt;# Load the snapins, type data, format data&lt;br /&gt;#&lt;br /&gt;Push-Location&lt;br /&gt;cd $sqlpsPath&lt;br /&gt;Add-PSSnapin SqlServerCmdletSnapin100&lt;br /&gt;Add-PSSnapin SqlServerProviderSnapin100&lt;br /&gt;Update-TypeData -PrependPath SQLProvider.Types.ps1xml &lt;br /&gt;update-FormatData -prependpath SQLProvider.Format.ps1xml &lt;br /&gt;Pop-Location&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;After executing this scripts you can run commands like:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Invoke-Sqlcmd -Query "SELECT @@VERSION;"&lt;br /&gt;&lt;br /&gt;Column1 &lt;br /&gt;------- &lt;br /&gt;Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) ... &lt;br /&gt;&lt;br /&gt;Here’s a more entertaining script that executes an arbitrary command on a list of SQL servers&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$servers=get-content "D:\Nigel\PowerShell\SqlServers.txt"&lt;br /&gt;foreach($server in $servers)&lt;br /&gt;{&lt;br /&gt;# go to each server and execute the command in D:\Nigel\PowerShell\SQLCommand.txt&lt;br /&gt;# Invoke-sqlcmd -ServerInstance $server -Database master -InputFile “D:\Nigel\PowerShell\SQLCommand.txt”; &lt;br /&gt;Invoke-Sqlcmd -ServerInstance $server -Query "SELECT @@VERSION;"&lt;br /&gt;} &lt;br /&gt;Extending this to include input from a file:&lt;br /&gt;$servers=get-content "D:\Nigel\PowerShell\SqlServers.txt"&lt;br /&gt;foreach($server in $servers)&lt;br /&gt;{&lt;br /&gt;# go to each server and execute the command in D:\Nigel\PowerShell\SQLCommand.txt&lt;br /&gt;# Invoke-sqlcmd -ServerInstance $server -Database master &lt;br /&gt;Invoke-Sqlcmd -ServerInstance $server -InputFile “D:\Nigel\PowerShell\SQLCommand.txt”; &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;SQLCommand.txt&lt;br /&gt;==============&lt;br /&gt;SELECT @@VERSION;&lt;br /&gt;&lt;br /&gt;SqlServers.txt&lt;br /&gt;==============&lt;br /&gt;CHMyServer1&lt;br /&gt;CHMyServer2&lt;br /&gt;&lt;br /&gt;&lt;/CODE&gt;&lt;br /&gt;Here’s a URL that describes how to make your own powershell commandlets&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gangleri.net/2009/04/21/BuildingPowerShellCmdletsWithVisualStudio2008.aspx"&gt;http://www.gangleri.net/2009/04/21/BuildingPowerShellCmdletsWithVisualStudio2008.aspx&lt;/a&gt;&lt;br /&gt;Building PowerShell Cmdlets with Visual Studio 2008&lt;br /&gt;&lt;br /&gt;1.Download Windows PowerShell Cmdlet templates from CodePlex &lt;br /&gt;2.Run the VSI installer to install the project and item templates&lt;br /&gt;3.Open Visual Studio 2008 and select File-&amp;gt;New-&amp;gt;Project&lt;br /&gt;4.From the New Project dialog select the ‘PowerShellCmdlet’ template&lt;br /&gt;5.Now right click on the project and select ‘Add New Item’. This will show the ‘Add New Item’ dialog. You can see that there are class templates for PSCmdlets, Cmdlets, SnapIns and XML helper files. For now select the Cmdlet template.&lt;br /&gt;6.The ProcessRecord method performs the actual processing for the Cmdlet, in this example we will just call the WriteObject method to display the ‘Hello World’ message.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;using System.Management.Automation;&lt;br /&gt;namespace HelloPowerShell&lt;br /&gt;{&lt;br /&gt;[Cmdlet(VerbsCommon.Get, "HelloCmdlet")]&lt;br /&gt;public class HelloCmdlet : Cmdlet&lt;br /&gt;{&lt;br /&gt;protected override void ProcessRecord()&lt;br /&gt;{&lt;br /&gt;WriteObject("Hello World!");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;7.Again right click on the project and select add new item, this time select the ‘PowerShellCmdlet Help XML’. The template will automatically prefix ‘.dll-help.xml’ therefore you should just type ‘Get-Hello’ as the name.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;/code&gt;&lt;code&gt;&lt;br /&gt;using System.Collections.ObjectModel;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;using System.Management.Automation;&lt;br /&gt;using System.Management.Automation.Runspaces;&lt;br /&gt;namespace HelloPowerShell&lt;br /&gt;{&lt;br /&gt;[RunInstaller(true)]&lt;br /&gt;public class HelloSnapIn : CustomPSSnapIn&lt;br /&gt;{&lt;br /&gt;private Collection&lt;cmdletconfigurationentry&gt; _cmdlets;&lt;br /&gt;&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// Gets description of powershell snap-in.&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;public override string Description&lt;br /&gt;{&lt;br /&gt;get { return "A Description of HelloCmdlet"; }&lt;br /&gt;}&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// Gets name of power shell snap-in&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;public override string Name&lt;br /&gt;{&lt;br /&gt;get { return "HelloCmdlet"; }&lt;br /&gt;}&lt;br /&gt;/// &lt;summary&gt;&lt;br /&gt;/// Gets name of the vendor&lt;br /&gt;/// &lt;/summary&gt;&lt;br /&gt;public override string Vendor&lt;br /&gt;{&lt;br /&gt;get { return ""; }&lt;br /&gt;}&lt;br /&gt;public override Collection&lt;cmdletconfigurationentry&gt; Cmdlets&lt;br /&gt;{&lt;br /&gt;get&lt;br /&gt;{&lt;br /&gt;if (null == _cmdlets)&lt;br /&gt;{&lt;br /&gt;_cmdlets = new Collection&lt;cmdletconfigurationentry&gt;();&lt;br /&gt;_cmdlets.Add(new CmdletConfigurationEntry&lt;br /&gt;("Get-HelloCmdlet", typeof(HelloCmdlet), "Get-HelloCmdlet.dll-Help.xml"));&lt;br /&gt;}&lt;br /&gt;return _cmdlets;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;8.Now add another new item and select the ‘PowerShellCmdlet SnapIn’ template. Call this ‘HelloSnapIn.cs’&lt;br /&gt;&lt;br /&gt;9.By default the SnapIn template fills out some sample information using MyCmdlet as the name simply change this to refer to Get-HelloCmdlet. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;10.You can build the project and get a dll&lt;br /&gt;&lt;br /&gt;11.Now start Windows PowerShell and run with administrator privileges as you will be installing a Cmdlet.&lt;br /&gt;&lt;br /&gt;12.If you are using a 64-bit version of windows issue the command:&lt;br /&gt;Set-Alias installutil C:\Windows\Microsoft.NET\Framework64\v2.0.50727\InstallUtil.exe &lt;br /&gt;&lt;br /&gt;If you have a 32-bit version of windows issues the command:&lt;br /&gt;Set-Alias installutil C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe&lt;br /&gt;&lt;br /&gt;13.Now install your Cmdlet with the command:&lt;br /&gt;installutil HelloPowerShell.dll&lt;br /&gt;&lt;br /&gt;14.You can verify that the Cmdlet has been installed with the command:&lt;br /&gt;Get-PSSnapin -Registered&lt;br /&gt;&lt;br /&gt;15.Add the snap-in to your shell with:&lt;br /&gt;Add-PSSnapin HelloCmdlet&lt;br /&gt;&lt;br /&gt;16.You can run the Cmdlet with the command Get-HelloCmdlet and you should see the message “Hello World!”&lt;br /&gt;&lt;br /&gt;By the way in VS2010 the PowerShell templates are there by default&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-613952797605218850?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/613952797605218850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/613952797605218850'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2012/01/experimenting-with-powershell.html' title='Experimenting with Powershell'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-8447869436939570384</id><published>2011-12-29T01:35:00.000-08:00</published><updated>2011-12-29T01:36:35.349-08:00</updated><title type='text'>Moving an SSIS Package from a 32 bit machine to a 64 bit machine</title><content type='html'>I have an SSIS package that works on a 32 bit server but fails on a 64 bit machine with a number of errors, the most interesting being:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;[Excel Destination [511]] Error: SSIS Error Code DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER. The AcquireConnection method call to the connection manager "Excel Connection Manager" failed with error code 0xC00F9304. There may be error messages posted before this with more information on why the AcquireConnection method call failed.&lt;/blockquote&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;Surfing I found these sites...&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en/sqlintegrationservices/thread/289e29ad-26dc-4f90-bad4-ffb86c76e5f9"&gt;http://social.msdn.microsoft.com/Forums/en/sqlintegrationservices/thread/289e29ad-26dc-4f90-bad4-ffb86c76e5f9&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;a href="http://toddmcdermid.blogspot.com/2009/10/quick-reference-ssis-in-32-and-64-bits.html"&gt;http://toddmcdermid.blogspot.com/2009/10/quick-reference-ssis-in-32-and-64-bits.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;It turns out that there are a number of drivers that are available in 32 bit but are not available in 64 bit. It is possible to run an SSIS package in 32 bit on a 64 bit machine. These URLs suggest &lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;The first thing is to make the Visual Studio 2008 DTS package run in 32 bit mode in the designer. This can be done by:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;Goto the properties of the SSIS project&amp;nbsp;&lt;/li&gt;&lt;li&gt;In the left tree view select Configuration Properties&lt;/li&gt;&lt;li&gt;Set Run64BitRuntime = false&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div&gt;This enables you to debug the SSIS package. The next step is to execute the package in 32 bit. The easiest approach is to use &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;DTExec /f "D:\MyPath\MySSISPackage.dtsx" /SET \package.Variables[Variable1].Value;"Value1" /SET \package.Variables[Variable2].Value;"Value2" /X86&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;This works well if the total length of the command line is less than 255 characters. In my case I had a lot of parameters. &lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;To get arround this 255 caharacter limitation I think the best solution is to make a command line executable that is compiled in 32 bit. I thought about making a power shell command for this but decided it would be simpler to keep it to a command line and search the standard output for "Success" or "Failure". &lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;To get this to work I included the following DLLs:&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;D:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.ConnectionInfo.dll&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;D:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Dts.Design.dll&lt;br /&gt;&lt;br /&gt;D:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.DTSPipelineWrap.dll&lt;br /&gt;&lt;br /&gt;D:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SQLServer.DTSRuntimeWrap.dll&lt;br /&gt;&lt;br /&gt;D:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SQLServer.ManagedDTS.dll&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;The code looked like:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.Xml;&lt;br /&gt;using Microsoft.SqlServer.Dts.Runtime;&lt;br /&gt;using System.IO;&lt;br /&gt;using System.Threading;&lt;br /&gt;&lt;br /&gt;namespace Ssis32BitExec&lt;br /&gt;{&lt;br /&gt;class Program&lt;br /&gt;{&lt;br /&gt;static void Main(string[] args)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;if (args.Count() != 2)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine("Ssis32BitExec &lt;packagepath&gt;&lt;parameterpath&gt;");&lt;br /&gt;Console.WriteLine("===========================================");&lt;br /&gt;Console.WriteLine("");&lt;br /&gt;Console.WriteLine("Utility to execute an SSIS package in 32 bit mode thus enabling 32 bit drivers");&lt;br /&gt;Console.WriteLine("that may not be available in 64 bit");&lt;br /&gt;Console.WriteLine("");&lt;br /&gt;Console.WriteLine("");&lt;br /&gt;&lt;br /&gt;Console.WriteLine("&lt;packagepath&gt; UNC path to .dtsx file (SSIS package)");&lt;br /&gt;Console.WriteLine("&lt;parameterpath&gt; Path to parameter name and value pair file (This file");&lt;br /&gt;Console.WriteLine(" contains lines like ParameterName;ParameterValue)");&lt;br /&gt;&lt;br /&gt;Console.ReadLine();&lt;br /&gt;Environment.Exit(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;string packagePath = args[0];&lt;br /&gt;string parameterValuePairsPath = args[1];&lt;br /&gt;&lt;br /&gt;Console.WriteLine("SizeOf IntPtr is: {0}", IntPtr.Size);&lt;br /&gt;&lt;br /&gt;if (!File.Exists(packagePath))&lt;br /&gt;{&lt;br /&gt;Console.WriteLine("Failed: The following file does not exist {0}", packagePath);&lt;br /&gt;Environment.Exit(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (!File.Exists(parameterValuePairsPath))&lt;br /&gt;{&lt;br /&gt;Console.WriteLine("Failed: The following file does not exist {0}", parameterValuePairsPath);&lt;br /&gt;Environment.Exit(0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;XmlDocument packageDoc = new XmlDocument();&lt;br /&gt;packageDoc.Load(packagePath);&lt;br /&gt;&lt;br /&gt;Package package = new Package();&lt;br /&gt;package.LoadFromXML(packageDoc.DocumentElement, null);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;string[] lines= File.ReadAllLines(parameterValuePairsPath);&lt;br /&gt;string[] Fields;&lt;br /&gt;foreach(string line in lines)&lt;br /&gt;{&lt;br /&gt;Fields = line.Split(';');&lt;br /&gt;if (Fields.Count() != 2)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine("Failed: The following line is not correctly formated {0}", line);&lt;br /&gt;Thread.CurrentThread.Abort();&lt;br /&gt;}&lt;br /&gt;if (package.Variables.Contains(Fields[0]))&lt;br /&gt;{&lt;br /&gt;package.Variables[Fields[0]].Value=Fields[1];&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//This is a fudge factor that allows a badly constructed package to throw some errors and run through&lt;br /&gt;//package.MaximumErrorCount = 2;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;DTSExecResult result = package.Execute();&lt;br /&gt;&lt;br /&gt;if (result == DTSExecResult.Success)&lt;br /&gt;{&lt;br /&gt;Console.WriteLine("Success");&lt;br /&gt;Environment.Exit(0);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;Console.WriteLine("Failed");&lt;br /&gt;for (int i = 0; i &amp;lt; package.Errors.Count; i++) { Console.WriteLine(package.Errors[i].Description); } Environment.Exit(1); } } } } &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;To know for sure that this is running in 32 bit the Console.WriteLine("SizeOf IntPtr is: {0}", IntPtr.Size); equals 4 for 32 bit and 8 for 64 bit.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;I call this from within VB.NET in:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Dim TempFilePath As String = IO.Path.GetTempFileName&lt;br /&gt;Dim Sw As New StreamWriter(TempFilePath)&lt;br /&gt;Sw.WriteLine("Param1;{0}", Value1)&lt;br /&gt;Sw.WriteLine("Param2;{0}", Value2)&lt;br /&gt;Sw.Close()&lt;br /&gt;&lt;br /&gt;Dim SSIS32BitProcess As New ProcessStartInfo()&lt;br /&gt;SSIS32BitProcess.WorkingDirectory = Environment.CurrentDirectory&lt;br /&gt;SSIS32BitProcess.FileName = "Ssis32BitExec.exe"&lt;br /&gt;SSIS32BitProcess.UseShellExecute = False&lt;br /&gt;SSIS32BitProcess.RedirectStandardOutput = True&lt;br /&gt;SSIS32BitProcess.RedirectStandardError = True&lt;br /&gt;SSIS32BitProcess.Arguments = packagePath + " " + TempFilePath&lt;br /&gt;&lt;br /&gt;Dim Proc As Process = Process.Start(SSIS32BitProcess)&lt;br /&gt;&lt;br /&gt;Dim Out As String = Proc.StandardOutput.ReadToEnd()&lt;br /&gt;Proc.WaitForExit()&lt;br /&gt;&lt;br /&gt;Dim Err As String = Proc.StandardError.ReadToEnd()&lt;br /&gt;Proc.WaitForExit()&lt;br /&gt;&lt;br /&gt;If Out.Contains("Success") Then&lt;br /&gt;Return True&lt;br /&gt;Else&lt;br /&gt;Message = Out + vbCr + Err&lt;br /&gt;Return False&lt;br /&gt;End If&lt;br /&gt;File.Delete(TempFilePath)&lt;br /&gt;Return True&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-8447869436939570384?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/8447869436939570384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/8447869436939570384'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2011/12/moving-ssis-package-from-32-bit-machine.html' title='Moving an SSIS Package from a 32 bit machine to a 64 bit machine'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-7822044998593400282</id><published>2011-12-05T02:30:00.000-08:00</published><updated>2011-12-05T02:32:23.272-08:00</updated><title type='text'>How to version control databases using TFS and Visual Studio Database Projects</title><content type='html'>We have some databases that contain certain reference data. We would like to keep track of changes to both the schema and the reference data and store both in one central place. Another challenge was to allow everyone to develop on a local version of the database thus avoiding colliding and breaking changes. This was solved in the following way: &lt;br /&gt;&lt;br /&gt;1. Open Visual Studio 2010&lt;br /&gt;2. File/New Project&lt;br /&gt;3. Go to the tree view of the New Project Dialog select&lt;br /&gt;Database/SQL Server&lt;br /&gt;4. In the list select SQL Server 2008 Database Project&lt;br /&gt;- Choose an appropriate Solution Name&lt;br /&gt;- The Name should be the same as the database you are putting into source control&lt;br /&gt;5. [OK]&lt;br /&gt;6. Right mouse click on the database project and select "Import Database Objects and Settings"&lt;br /&gt;7. Click New Connection&lt;br /&gt;8. Server Name = (local)&lt;br /&gt;Database Name = the local database you are trying to version&lt;br /&gt;[OK]&lt;br /&gt;9. Select the following check boxs:&lt;br /&gt;Script the collation only if it is different from the database collation&lt;br /&gt;Import extended properties&lt;br /&gt;10. [Start]&lt;br /&gt;&lt;br /&gt;If you have multiple instances of SQL Server (eg 2005, 2008 etc) Then you need to create an Alias for the database instance that you are targeting&lt;br /&gt;&lt;br /&gt;Aliases are created by:&lt;br /&gt;1. Open Sql Server Configuration Manager&lt;br /&gt;2. Click on the SQL Server Network Configuration and enable Named Pipes &lt;br /&gt;3. Click on all versions of SQL Native Cient 10.0 Configuration&lt;br /&gt;Add a new alias&lt;br /&gt;- Alias Name: MyDB_LOCAL&lt;br /&gt;- Pipe Name: \\localhost\pipe\MSSQL2008R2&lt;br /&gt;- Protocol: Named Pipes&lt;br /&gt;- Server: localhost\SQL2008R2 &lt;br /&gt;4. Repeat 3 for SQL Native Cient 10.0 Configuration (32bit)&lt;br /&gt;&lt;br /&gt;The Database may be documented using extended properties&lt;br /&gt;&lt;br /&gt;Extended properties are access by&lt;br /&gt;1. Open the Microsoft SQL Server Management Studio ...&lt;br /&gt;2. Right Mouse click and select properties&lt;br /&gt;3. In the tree view select properties&lt;br /&gt;4. Add the combination of Name and Value&lt;br /&gt;Extended properties are available on the database level down to the table field level&lt;br /&gt;&lt;br /&gt;After this you have imported the database schema into a Visual Studio Database project. The next step is to insert data. Depending on what you want to achieve there are several mechanisms for importing data. &lt;br /&gt;&lt;br /&gt;The PostDeployment script is intended to be used for populating reference data. This can be found in the following way:&lt;br /&gt;In the VS2010 database projects under the solution directory Scripts\PostDeployment\Script.PostDeployment.sql&lt;br /&gt;In the file system under DatabaseProject\Scripts\Post-Deployment&lt;br /&gt;&lt;br /&gt;There are several possibilities for inserting reference data:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. If it's small you can use INSERT INTO eg&lt;/b&gt;&lt;br /&gt;INSERT INTO [MyDatabase].[dbo].[DATABASE_VERSION] ([DATE],[MODEL_VERSION],[DATABASE_VERSION],[COMMENTS])&lt;br /&gt;VALUES ('2011-01-07','4.1.0','1.0.0','A comment about what is new in this version')&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2. If it's big and in multiple tables any you are not looking to compare changes in reference data you can include a bakup of a database.&lt;/strong&gt; &lt;br /&gt;&lt;br /&gt;Then the script would look something like:&lt;br /&gt;&lt;br /&gt;USE [master]&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;if (exists(select * from sys.databases where name=N'Testdata') )&lt;br /&gt;begin&lt;br /&gt;EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'Testdata'&lt;br /&gt;&lt;br /&gt;ALTER DATABASE [Testdata] SET SINGLE_USER WITH ROLLBACK IMMEDIATE&lt;br /&gt;&lt;br /&gt;DROP DATABASE [Testdata]&lt;br /&gt;end&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;-- Note that SolutionRoot is an environmental variable that can either be set in the control panel or via a batch file that opens the database project&lt;br /&gt;&lt;br /&gt;RESTORE DATABASE [Testdata] FROM DISK = N'$(SolutionRoot)\MyDatabase\Scripts\Post-Deployment\Testdata.bak' WITH FILE = 1, MOVE N'Testdata' TO N'$(DefaultSqlFileLocation)\Testdata.mdf', MOVE N'Testdata_log' TO N'$(DefaultSqlFileLocation)\Testdata_1.ldf', NOUNLOAD, REPLACE, STATS = 10&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;INSERT [MyDatabase].[dbo].[StudentList] (StFName,StLName,StEmail,OrderID)&lt;br /&gt;SELECT StFName,StLName,StEmail,OrderID FROM [Testdata].[dbo].[StudentList]&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3. Here is another method using BCP and a binary file.&lt;/strong&gt; &lt;br /&gt;This can be useful when you don't want the inconvenience of creating a backup etc. &lt;br /&gt;&lt;br /&gt;To create the bcp file (adjust the table in the from-clause, and possibly the server after the -S param):&lt;br /&gt;bcp "select field1,field2,field3 from MyDatabase.dbo.MyTable order by Id asc" queryout MyTable.bcp -S localhost -T -E -N&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The script looks something like:&lt;br /&gt;&lt;br /&gt;:setvar EstimatedRowCount 5000000&lt;br /&gt;&lt;br /&gt;ALTER TABLE MyDatabase.dbo.MyTable NOCHECK CONSTRAINT ALL &lt;br /&gt;&lt;br /&gt;bulk insert MyDatabase.dbo.MyTable from '$(SolutionRoot)\MyDatabase\Scripts\Post-Deployment\MyTable.bcp' with (DATAFILETYPE = 'widenative', order(ModelEventId asc), keepidentity, KEEPNULLS, ROWS_PER_BATCH = $(EstimatedRowCount))&lt;br /&gt;&lt;br /&gt;ALTER TABLE MyDatabase.dbo.MyTable WITH CHECK CHECK CONSTRAINT ALL &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;4. Here is another method using BCP and a text file.&lt;/strong&gt; &lt;br /&gt;With this it is possible to compare versions of reference data directly out of TFS&lt;br /&gt;To create the text file &lt;br /&gt;&lt;br /&gt;i. Right mouse click on the database name and select All Tasks/Export Data&lt;br /&gt;ii. Select Next and then in the Choose a source dialog select&lt;br /&gt;- Database source : SQL Server Native Client 10.0&lt;br /&gt;- Server Name : The Server Name&lt;br /&gt;- Database : The database&lt;br /&gt;[Next]&lt;br /&gt;iii In the Choose a destination dialog choose:&lt;br /&gt;- Destination : Flat File Destination&lt;br /&gt;- File name : path to tablename.txt&lt;br /&gt;- Locale : English (United states)&lt;br /&gt;- Code Page 1252 (NASI Latin1)&lt;br /&gt;- Unicode is not checked&lt;br /&gt;- Format : Delimted&lt;br /&gt;- Text qualifier : &lt;none&gt;&lt;br /&gt;- Column names in the first data row is not checked&lt;br /&gt;Next&lt;br /&gt;iv - Copy data from one or more tables or views&lt;br /&gt;Next&lt;br /&gt;v . Source taböle or view : the table to be exported&lt;br /&gt;- Row delimiter : {CR}{LF}&lt;br /&gt;- Column delimiter : Semicolon {;}&lt;br /&gt;Next&lt;br /&gt;vi - Run immediately&lt;br /&gt;Finish&lt;br /&gt;Finish&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Then to import script looks like:&lt;br /&gt;&lt;br /&gt;BULK INSERT MyTable FROM '$(TFSROOT)\DataBases\MyDatabase\Scripts\Post-Deployment\MyTable.txt' WITH (FIELDTERMINATOR = ';', ROWTERMINATOR = '\n' )&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So now we have a Visual Studio 2010 Database project and data. Now suppose that you have a view that references another table in another database. You then create a sub database project within the database solution but when you want to deploy the database you get an error like &lt;br /&gt;&lt;br /&gt;Error 2 SQL03006: View: [dbo].[MyView] has an unresolved reference to object [MyOtherDatabase].[dbo].[MyOtherTable]. D:\SOURCE\DataBases\MyDatabase\Schema Objects\Schemas\dbo\Views\MyView.view.sql 12 23 MyDatabase&lt;br /&gt;&lt;br /&gt;Looking at the SQL &lt;br /&gt;CREATE VIEW dbo.MyView&lt;br /&gt;AS&lt;br /&gt;SELECT dbo.MyTable.field1, MyOtherDatabase.dbo.MyOtherTable.Field&lt;br /&gt;FROM dbo.MyTable INNER JOIN&lt;br /&gt;MyOtherDatabase.dbo.MyOtherTable ON dbo.MyTable.Id = MyDatabase.dbo.MyTable.FKId&lt;br /&gt;&lt;br /&gt;The problem is MyOtherDatabase.dbo.MyOtherTable.Field to a field in a table in another database. This is causing the deployment to fail. The solution to this can be found in an article on how to defining Cross-Database References at http://msdn.microsoft.com/en-us/library/bb386242.aspx&lt;br /&gt;When adding the database reference you must define a database variable. &lt;br /&gt;Fill out the Add Database Reference as follows:&lt;br /&gt;- Database projects in the current solution: YourRefDB&lt;br /&gt;- Database Reference Variables&lt;br /&gt;- Name&lt;br /&gt;- Uncheck Literal&lt;br /&gt;Name $(IO_DB) Value YourRefDB&lt;br /&gt;- Check Update the existing schema object definitions and scripts to use the database variables&lt;br /&gt;- Check Suppress errors caused by unresolved references in the reference project&lt;br /&gt;[OK]&lt;br /&gt;Then you get to an opportunity to edit the modifications to the scripts&lt;br /&gt;This resolves the compilation errors. &lt;br /&gt;&lt;br /&gt;The next problem comes when we want to change the Deployment function from generating a script to deploying the script&lt;br /&gt;Going to the solution view and looking at the properties of the database project and changing the Deploy action to "Create a deployment script (.sql) and deploy to database&lt;br /&gt;&lt;br /&gt;Message 1 The deployment script was generated, but was not deployed. You can change the deploy action on the Deploy tab of the project properties. D:\SOURCE\DataBases\DBProj\DBName\sql\debug\DbName.sql 0 0 DBName&lt;br /&gt;&lt;br /&gt;The solution to this is:&lt;br /&gt;1 Right mouse click on the database project and select properties &lt;br /&gt;2 Goto the Deployment tab&lt;br /&gt;3 Edit Target connection&lt;br /&gt;Server :(local)&lt;br /&gt;Database name :MyDatabase&lt;br /&gt;&lt;br /&gt;After this the deployment of the database project works…&lt;br /&gt;&lt;br /&gt;I found some other curious effects. If you try and open this database project on a server where you have uninstalled SQL2008 R2 and installed SQL2008 SP3 you will get the following error&lt;br /&gt;&lt;br /&gt;D:\SOURCE\DataBases\MyDBProject\DBName\DBName.dbproj : error : Could not load file or assembly 'Microsoft.SqlServer.Management.SqlParser, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies. The system cannot find the file specified.&lt;br /&gt;&lt;br /&gt;This problem is caused because the uninstall process removed some assemblies needed by Visual Studio to correctly interpret the database project. There are 2 ways to solve this. Either re-install VS2010 or run the following commands&lt;br /&gt;&lt;br /&gt;Open a command line and goto: D:\Software\VS2010\DVD\WCU\SMO&lt;br /&gt;Then execute&lt;br /&gt;msiexec /i SQLSysClrTypes_amd64_enu.msi&lt;br /&gt;msiexec /i SharedManagementObjects_amd64_enu.msi&lt;br /&gt;&lt;br /&gt;Next change dir to D:\Software\VS2010\DVD\WCU\DAC and execute:&lt;br /&gt;msiexec /i DACFramework_enu.msi&lt;br /&gt;msiexec /i DACProjectSystemSetup_enu.msi&lt;br /&gt;msiexec /i TSqlLanguageService_enu.msi&lt;br /&gt;&lt;br /&gt;Another interesting thing happens when the MS SQL2008 Server has been setup with different paths. &lt;br /&gt;To fix this problem go to the database project and then open the following solution folder path Schema Objects/Database Level Objects/Storage/Files. Here you will find 2 files with names like:&lt;br /&gt;&lt;br /&gt;MyDatabase.sqlfile.sql&lt;br /&gt;MyDatabase_log.sqlfile.sql&lt;br /&gt;&lt;br /&gt;Within these files you have &lt;br /&gt;&lt;br /&gt;ALTER DATABASE [$(DatabaseName)]&lt;br /&gt;ADD FILE (NAME = [MyDatabaseName], FILENAME = 'G:\Data\MyDatabaseName.mdf', FILEGROWTH = 1024 KB) TO FILEGROUP [PRIMARY];&lt;br /&gt;&lt;br /&gt;To make the database project run on any setup you need to modify the path using the environmental variables DefaultDataPath and DefaultLogPath. For example:&lt;br /&gt;&lt;br /&gt;ALTER DATABASE [$(DatabaseName)]&lt;br /&gt;ADD FILE (NAME = [$(DatabaseName)], FILENAME = '$(DefaultDataPath)$(DatabaseName).mdf', FILEGROWTH = 1024 KB) TO FILEGROUP [PRIMARY];&lt;br /&gt;&lt;br /&gt;By the way if you want to use environmental variables within a Query in MS SQL Server Manager you need to:&lt;br /&gt;&lt;br /&gt;1. Goto the Query drop down menu&lt;br /&gt;2. Select SQLCMD Mode&lt;br /&gt;3. Cut and paist script....&lt;br /&gt;&lt;br /&gt;Then you can use commands like &lt;br /&gt;&lt;br /&gt;:setvar somevariable somevalue&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-7822044998593400282?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/7822044998593400282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/7822044998593400282'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2011/12/how-to-version-control-database-using.html' title='How to version control databases using TFS and Visual Studio Database Projects'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-120860428900182458</id><published>2011-10-07T07:30:00.000-07:00</published><updated>2011-10-07T07:38:56.243-07:00</updated><title type='text'>Cross platform applications with HTML5/JavaScript and how this ties in with SOLID OO principles</title><content type='html'>I have just started to think about writing applications that are cross platform impendent ie that can run on devices like iPad. Here are some notes about this subject&lt;br /&gt;Over the last few years I have made extensive use of SOLID. OO programmin principles as I developed C# applications in .Net.&lt;br /&gt;&lt;br /&gt;Where&lt;br /&gt;SRP: The Single Responsibility Principle A class should have one, and only one, reason to change.&lt;br /&gt;OCP: The Open Closed Principle You should be able to extend a classes behavior, without modifying it.&lt;br /&gt;LSP: The Liskov Substitution Principle Derived classes must be substitutable for their base classes.&lt;br /&gt;ISP: The Interface Segregation Principle Make fine grained interfaces that are client specific.&lt;br /&gt;DIP: The Dependency Inversion Principle Depend on abstractions, not on concretions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;My first reaction was to reapply these principles in JavaScript. So I started to think of interfaces, dependency injection containers, mocking frameworks and Test Driven development. It turns out that there is a fundamental difference between C# and JavaScript in the sence that c# is class based and JavaScript is prototypical. So it is difficult to apply the notion of interfaces and abstraction in the world of JavaScript.&lt;br /&gt;&lt;br /&gt;So the question is what principles are relevant to a Prototypical language over a Class based OO language. As far as I can see :&lt;br /&gt;&lt;br /&gt;S Applicable&lt;br /&gt;O Not Applicable&lt;br /&gt;L Applicable&lt;br /&gt;I Not Applicable&lt;br /&gt;D Not Applicable&lt;br /&gt;&lt;br /&gt;One principle that applys to both programming paradigms is DRY which stands for Don't Repeat Yourself&lt;br /&gt;&lt;br /&gt;JavaScript Object Oriented Programming include classes, inheritance, and scope that can be used encapsulate, support namespaces, and avoid collisions. Actually JavaScript does not have a class entity BUT it implements the pattern of classes. The difference is in the inheritance model. In other object oriented languages, class is an actual data type that represents the blueprint for creating objects. In JavaScript, although we can use Functions to simulate an object blueprint, they are just in fact objects themselves. These objects are then used as models (aka prototypes) for other objects. Applying the concept of prototypal inheritance allows us to create “subclasses”, or objects that inherit the properties of another object. This becomes particularly useful when we want to use the methods of another object with some slight modifications.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The next thing I was thinking about is that after programming a while in Xaml I preffer to use the MVVM model over the MVC. This is in MVC the Controller is tightly coupled to the view. In practical terms this means that every time you need to change a control on the view the controller needs to change things like how this effects all the other controls. Where as in MVVM the View is completely separate from the VM and thus a change to a control results in minimal update to the ViewModel. It turns out that there is a JavaScript library called KnockOut.js that makes the MVVM pattern possible&lt;br /&gt;&lt;br /&gt;Here are some examples of JavaScript. It can be seen that JavaScript is far from just a begineers language. JavaScript's prototypal OOP is flexible and it does not limit the programmer to things like static typing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is an example of how to create your own foreach function:&lt;br /&gt;&lt;br /&gt;Array.prototype.foreach.function(callback)&lt;br /&gt;{&lt;br /&gt;for (var i=0; i&lt;this.length;i++) self="this;" a="[1,2,3]" f="module(p)" collect="function(collector)" inputmodule="foreach(Module)" op="{"&gt;= companrand:}&lt;br /&gt;"=" : function(comporand){return function(e){return e= companrand:}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;a.set(op["&amp;gt;="](5).foreach(alert);&lt;br /&gt;&lt;br /&gt;This is called Curring after Mr Curry.&lt;br /&gt;btw If you uise this in DOS you will need toescape the &amp;gt; to ^&amp;gt;&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;Here is a way tobiuld up the arrays:&lt;br /&gt;Number.protype.inputModule&lt;br /&gt;{&lt;br /&gt;UpTo : function(Upeer,step)&lt;br /&gt;{&lt;br /&gt;var a[]&lt;br /&gt;for(var i = this.valueof(Upper); j &lt;upper;&gt;return a;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;(1).Upto(20,2).....&lt;br /&gt;&lt;br /&gt;This is called High Order Programming&lt;br /&gt;&lt;br /&gt;Here's a link to some further examples: http://www.w3schools.com/js/&lt;br /&gt;&lt;br /&gt;The next version of Visual Studio will have a lot more support for JavaScript development, so this should reduce the barrier to trying this out...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-120860428900182458?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/120860428900182458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/120860428900182458'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2011/10/cross-platform-applications-with.html' title='Cross platform applications with HTML5/JavaScript and how this ties in with SOLID OO principles'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-3637366172497005596</id><published>2011-09-27T00:28:00.000-07:00</published><updated>2011-09-27T00:36:47.971-07:00</updated><title type='text'>Condensed notes from the Build about where Microsoft technology is going over the next year</title><content type='html'>Here is a summary of what I learned at the Build. I went to a lot of trouble this year to attend this conference which was not easy considering that the agenda was empty up to the last minute. But it was certainly worth while because Microsoft reveled where it is going with its technology which included a unified user experience from mobile devices through to large television sized devices.&lt;br /&gt;&lt;br /&gt;CNN “Microsoft unveils a radically redesigned Windows 8”&lt;br /&gt;&lt;br /&gt;This technology will only be available in about a year from now, probably industry will adopt this in perhaps 2 years from now. This conference is important because no strategy would be complete without an idea of where Windows is going because it is our main operating system. It is necessary because our software engineers need to gather the skills needed to take advantage of this technology and it is necessary in order to make informed decisions over if and how to integrate other technology such as iPhone and iPad.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Windows 8 Metro Style&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;We can expect a shift towards touch base applications over the coming years. Microsoft is of the opinion that all screens will be touched enabled and the ones that are not will feel antiquated when used. To make use of the Windows 8 metro style the user will have to adapt by learning new gestures and become familiar with the concept of having a less cluttered desktop using active Tiles. This means a “Re imagine your application” when making an application in Metro style. It was emphasized that there are a number of applications where the chrome style is simply the most appropriate meaning that this style of UI will continued to be supported. The difference between metro and chrome will go along the lines of the difference between a DOS prompt and Windows ie an expert system that requires training to a intuitive system that requires minimal training. Chrome seems to be based on the philosophy that “Less is more”.&lt;br /&gt;&lt;br /&gt;Performance and energy saving has become a key factor in the design of Windows 8. A cold start up takes about 20 seconds. To make this possible the number of running processes has been minimized and that tasks that are not currently in view are suspended. This has an impact on the design and development of applications because they only have a few seconds to persist there state before the task is suspended. It is now possible to boot a Windows 8 client directly from a USB memory stick. Also the first bleeding edge problems with VS are coming to light eg&lt;br /&gt;&lt;br /&gt;http://blog.galasoft.ch/archive/2011/09/25/quick-tip-killing-a-metro-style-app-in-windows-8.aspx?utm_source=twitterfeed&amp;amp;utm_medium=twitter&amp;amp;utm_campaign=Feed%3A+galasoft+%28Laurent+Bugnion+%28GalaSoft%29%29&lt;br /&gt;&lt;br /&gt;There are some features that may take more time to be adopted by the industry. Such as location aware applications that can make use of local devices or the touch sensor that perform a kind of electronic hand shake and setup a link between the 2 devices for collaboration or simply to exchange an electronic business card.&lt;br /&gt;&lt;br /&gt;The Windows 8 user experience is based on a fast and fluid immersive and full screen user experience. Applications communicate with each other through “charms” that are implemented via shared contracts. The same intuitive interface will be used across all Windows devices from mobile devices through desk tops and televisions.&lt;br /&gt;&lt;br /&gt;The result is a non cluttered canvas with controls. Commands that are frequently used go on the canvas, all others are revealed through the edge gestures. The metro style desktop consists of Tiles that provide simple text or images via pre defined templates and come in 2 sizes. Secondary tiles are created by pinning the content of the application and have the same capabilities as the main tile. They provide a deep link within the application. Live tiles keep people connected to your app and male it more likely the application is put on the first page.&lt;br /&gt;&lt;br /&gt;Notifications appear via a toaster icon that appears for a short period of time and user must opt onto it. They use Windows Push Notification Service WNS and can update any time your application is running&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;There is a new layer that sits directly on the Windows Kernal called WinRT. This is a clean API that has no duplication of Runtime API and all obsolete or inapplicable APIs have been removed. Metro style apps for c# and VB.net can interact directly with WinRT APIs or via .Net for Metro style apps via the CLS and Win32 APIs.&lt;br /&gt;&lt;br /&gt;To publish a metro app there is a pipeline of checks that guarantee that an application quality. This consists of Pre Processing, Security tests, Technical Compliance, Content compliance, Signing and publishing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;x86, 64, and ARM processors will all be supported. This has a big positive implication that all mobile devices running on ARM processors will support these applications.&lt;br /&gt;&lt;br /&gt;No solid time line was given. Some guesses included perhaps it being available about this time next year. The next milestone is Beta, the RC, then RTM and then GA&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Windows 8 Server&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;I did not attend many Windows 8 server sessions. But a lot of progress has been made on performance. I also believe that the HyperV virtualization has been improved by lessons learned in Azure. This is a way to make low cost hard disks available in a SAN. This can perform very fast because it is possible to make use of more than 1 network card through teaming. It is also possible to change a system drive on the fly.&lt;br /&gt;.Net 4.5&lt;br /&gt;&lt;br /&gt;In the key note it is really sure that Silverlight is definitely not dead. Microsoft has been working on making it possible to program the UI in languages programmers might choose. This includes the HTML5/Java script as well as C++. Microsoft is in the process of making a metro style implementation of office. From what I could determine this is going to be made using HTML5 for the view part of the presentation layer and Java script as the model art of the view model. All this sits on WinRT APIs which sits directly on Window Kernel Services. At first site this has been misinterpreted last year as a move away from Silverlight. This is not the case because the idea is to allow the programmer to express themselves in any appropriate programming language and this was demonstrated by including demonstrations in C and C++. I asked some experts whether the HTML5/JavaScript implementation would use the MVVM pattern. The answer was that this question had been asked by a lot of people and that it should be possible but there are no examples for this yet.&lt;br /&gt;&lt;br /&gt;Entity framework EF 4.5 now includes Enums, SQL Server and Azure features such as spatial functions&lt;br /&gt;In .Net 4 data manipulation was made by first starting with the data and then setting up the computation. TPL Dataflow allows the computation to be first setup and then the data&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Other Parallel Computing Additions&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Combinators Task.WhenAll, Task.WhenAny&lt;br /&gt;Timer integration Task.Delay(TimeSpan), CancellationTokenSource.CancelAfter(TimeSpan)&lt;br /&gt;Task schedulingConcurrentExclusiveSchedulerPair&lt;br /&gt;Fine-grained control DenyChildAttach, HideScheduler, LazyCancellation, EnumerablePartitionerOptions&lt;br /&gt;ThreadLocal&lt;t&gt;.Values&lt;br /&gt;PERFORMANCE (“it’s just faster”)&lt;br /&gt;The garbage collector has been improved. A multi-cored JIT with pre-fetch options makes ASP.Net start 35% faster.&lt;br /&gt;&lt;br /&gt;.Net 4.5 is an in place upgrade from .Net 4.0&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;VS2011&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Firstly VS2011 can open VS2010 project without changing the format.&lt;br /&gt;&lt;br /&gt;There is a 3D editor that has the capability of breaking down each transformation that is made to a 3D object. It is not designed for creating these objects but can manipulate them. Improvements have been made on the IDE experience for C++ programmers. This includes unit tests, and color intellisence pickers etc.&lt;br /&gt;&lt;br /&gt;Visual Studio 11 is the tool for Windows 8 and supports VB.NET, C#, C++ &amp;amp; HTML5/JS. There is a new designer Available today built on shared architecture with Expression Blend. When shelving changes information over which windows are open are saved together with the shelf set and are re established when opening the shelve set the windows are reopened in their original position. There is also a document well that avoids each time a file is clicked upon that a new document window is created. There is a XAML editor with IntelliSense. It is now possible to use C# code directly in Jscript and have changes in the generated HTML fed back into the code behind files.&lt;br /&gt;&lt;br /&gt;There is a static code analysis feature that allows you to look and replace chunks of repeated code.&lt;br /&gt;PowerPoint templates enable the mocking of an interactive UI.&lt;br /&gt;&lt;br /&gt;Asynchronous programming is necessary for creating responsive fast and fluent applications. Here are some new features coming with .Net 4.5&lt;br /&gt;&lt;br /&gt;Asynchronous programming models&lt;br /&gt;Windows Runtime: IAsyncOperation&lt;t&gt;&lt;br /&gt;.NET Framework: Task&lt;t&gt;&lt;br /&gt;JavaScript: Promises&lt;br /&gt;All are objects representing “ongoing operations”&lt;br /&gt;All use callbacks to signal completion of operation&lt;br /&gt;Challenge: Callbacks turn your code inside out&lt;br /&gt;Insight: Automatic transformation to callbacks is possible&lt;br /&gt;&lt;br /&gt;Asynchronous methods automatically transform normal code into a callback state machine eg&lt;br /&gt;&lt;br /&gt;public async Task&lt;xelement&gt; GetXmlAsync(string url) {&lt;br /&gt;var client = new HttpClient();&lt;br /&gt;var response = await client.GetAsync(url);&lt;br /&gt;var text = response.Content.ReadAsString();&lt;br /&gt;return XElement.Parse(text);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;.Net 5.0 aka Project Roslyn&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The .Net 5.0 JIT will be written in C#. This means that it will be possible to call APIs to the pipeline used to compile code. This pipeline comprises of 4 steps&lt;br /&gt;&lt;br /&gt;1. Parser&lt;br /&gt;2. Symbols / Meta data export&lt;br /&gt;3. Binder&lt;br /&gt;4. Emitter&lt;br /&gt;&lt;br /&gt;Here’s an example&lt;br /&gt;&lt;br /&gt;ScriptEngine engine = new ScriptEngine();&lt;br /&gt;Session session = Session.Create();&lt;br /&gt;Engine.Execute(“using System;, session);&lt;br /&gt;Engine.Execute(“for(int I = 0; I &amp;lt; 10; i++) Console.WriteLine(i*i);”,session); Var f = (func&lt;int,&gt;engine.Execute(“new Func&lt;int,int&gt;(Sqr)”);&lt;br /&gt;For (int i=0; i&amp;lt;10 i++) Console.WriteLine(f(i)); This might look strange but it could be used in allowing users to use a macro style interface to your application. In my case I doubt that I would use this but it is very interesting. I could imagine that this will allow mixing of languages that could be useful in creating fast code. There is also a command line Roslyn C# Compiler that runs in a similar style as for F# and includes intellisence and code tips. To create a reference to another assembly “er” is used, eg: Er “PresentationCore” Here’s an example of translating c# into VB Public VB.SytaxNode Covert( CS.SyntaxTree syntaxTree, IDictionary&lt;string,&gt; identifierMap = null,&lt;br /&gt;Bool convertStrings =false)&lt;br /&gt;{&lt;br /&gt;Var text = syntaxTree.Text;&lt;br /&gt;Var mode = syntaxTree.Root;&lt;br /&gt;Var vbText = Convert(text, node, identifierMap, convertStrings);&lt;br /&gt;Return VB.SyntaxTree.ParseCompilationUnit(vbText).Root;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;There is also a feature for .Net 3.5 on demand that I believe means that we don’t need to install the .Net 3.5 framework when certain obsolete functions are required.&lt;br /&gt;&lt;br /&gt;.Net 5 will be a fresh installation&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;HPC&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I have met up with some HPC / Azure MVPs and discussed some of the problems that I encountered when making my cat model in the cloud. The problem was that I was not able to transfer a 60 GB VM into the cloud including a local SQL Server. The suggestion was to use SQL Azure and transfer data via blob storage. In the next couple of months there will be a release of HPC Server that runs of a standard worker role meaning that we don’t need to construct and maintain our own VM. For very large quantities of data we could consider speeding up the queries by using TriadLinq aka Linq to HPC. This works by producing a sealed data block that is replicated between multiple nodes and is then queried upon in parallel. In addition to the Windows server based HPC Scheduler there is an Azure based HPC Scheduler. These are useful because it means that we don’t need to write our own schedulers.&lt;br /&gt;&lt;br /&gt;There was a demo of a PC with 4 water cooled graphics cards that had 2500 times the processing power of a Cray. The HPC team uses these machines for numerical tasks. Currently it takes a crack programmer to correctly program such an algorithm, the hope is that this will become abstracted away at some point in the future.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Azure&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Azure is a very cheap, elastic and quickly configurable source of compute power and one that we really should take advantage of. I saw some presentations on debugging and branch caching.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ALM Application Life Cycle Management&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Attendees of Build where given a golden ticket to an evaluation version of the SaaS version of Team Foundation Server 2010. This contains a many of Application Lifecyle Management features that are all a part of professional software engineering. The Application life cycle is based on 2 parts . The Development cycle where a product backlog is worked upon during sprints to create a working software asset. The Operations which consists of an Ops back log and monitoring. When a bug is discovered a corresponding requirement is made that is sent back to the development backlog. In addition to the existing ALM functions a Code review function was demonstrated in the context of a development team with inline or side by side code comparison&lt;br /&gt;&lt;br /&gt;Currently both TFS Server and TFS SaaS are capable of:&lt;br /&gt;Work items, Source Control and Build&lt;br /&gt;Agile Product/Project Management&lt;br /&gt;Test Case Management&lt;br /&gt;Heterogeneous Development&lt;br /&gt;&lt;br /&gt;TFS SaaS has the advantage when:&lt;br /&gt;Near Zero setup and administration&lt;br /&gt;Collaborate with anyone from anywhere&lt;br /&gt;&lt;br /&gt;TFS Server has the advantage when&lt;br /&gt;Virtual Test Lab Management&lt;br /&gt;SharePoint Integration&lt;br /&gt;Data Warehouse and Reporting&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-3637366172497005596?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/3637366172497005596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/3637366172497005596'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2011/09/condensed-notes-from-build-about-where.html' title='Condensed notes from the Build about where Microsoft technology is going over the next year'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-2887353843366286748</id><published>2011-09-22T14:57:00.000-07:00</published><updated>2011-09-22T16:43:01.629-07:00</updated><title type='text'>User experience in an L39 Jet</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/-m3bJ-NH4oVg/TnuvfeDjkGI/AAAAAAAAAAQ/ii1uDpZ1ALw/s1600/ZoomDSC00699.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5655306712272572514" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 173px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/-m3bJ-NH4oVg/TnuvfeDjkGI/AAAAAAAAAAQ/ii1uDpZ1ALw/s320/ZoomDSC00699.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This has got to be the ultimate user experience. I am sitting behind the pilot in this Russian designed L39 Jet. If anyone would like to try it is quite expensive but is something you will never forget. Here are some links:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.incredible-adventures.com/l-39-flights.html"&gt;http://www.incredible-adventures.com/l-39-flights.html&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.mach1aviation.com/varied/l-39-safety-video.htm"&gt;http://www.mach1aviation.com/varied/l-39-safety-video.htm&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;My pilot was Dave Riggs who is a hollywood stunt pilot for films like XXX, Iron Man, Lord of War. We flew together with David LaFaille and did some combat flying and some low level flight avoiding radar in canion, by low level I mean we flew 4m of the ground. My stomach had a problem digesting this new user experience so we finished the day with some formation flying.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-2887353843366286748?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/2887353843366286748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/2887353843366286748'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2011/09/user-experience-in-l39-jet.html' title='User experience in an L39 Jet'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-m3bJ-NH4oVg/TnuvfeDjkGI/AAAAAAAAAAQ/ii1uDpZ1ALw/s72-c/ZoomDSC00699.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-9097464382942957151</id><published>2011-09-15T06:19:00.000-07:00</published><updated>2011-09-15T06:21:45.968-07:00</updated><title type='text'>First Impression of the Build</title><content type='html'>Just before the build started I had a chance to talk to a user experience MVP and to a company that has made some compelling applications for Health care and emergency services. This was quite fortunate because the majority of this conference is all about a revamp of the way that the user experiences Windows. Basically over the coming years there will be a shift towards touch based applications. The vision is that all screens will be touched enabled and the ones that are not will feel antiquated when used.&lt;br /&gt;&lt;br /&gt;It was very interesting talking to Christian Moser before the conference. He is writing a book on User Experience where controls are represented by a kind of design pattern. For a control to be successful it’s use must be intuitive which means that it’s use should be common knowledge. This means that you should think twice before inventing a new way of interaction. In the context of Windows 8 this is going to be interesting because there are a new gestures that have been invented. Also the concept of having a less cluttered desktop with active tiles has an impact on the design of applications. I heard a lot the buzz word of “Re imagine your application”. There are a lot of sessions around this Metro style. It was also emphasized that for some applications the chrome style is simply the most appropriate UI and that this will be continued to be supported. While I was talking to Christian he mentioned that in his book he will be describing some aspects of expert users. Before the build the example on an expert user was the airline booking system which is a command line interface that requires a lot of training but is super efficient. I could imagine that the difference between metro and chrome would go down the same lines. Chrome seems to be based on the philosophy that “Less is more”, according to my friends at BlackMarble most users really appreciate something like this.&lt;br /&gt;&lt;br /&gt;In the key note it is really sure that Silverlight is definitely not dead. In fact MS has been working on making it possible to program the UI in languages programmers might choose. This includes the HTML5/Java script as well as C++. Performance and energy saving has become a key factor in the design of Windows 8.&lt;br /&gt;&lt;br /&gt;Before the conference I was talking to some friends at Black Marble about how an application can determine where it is. For example in a hospital application your device should know what other devices are nearby. This can be done in several ways. One way is to use the SID of the wireless network. This works quite well but there can be problems of leakage of signal from one zone to another. Another method that could be used is GPS repeaters. This is essentially like setting up a GPS satellite within your building. This could be particularly interesting for emergency services in conjunction with some mapping on a Surface 2 system to keep track of where there fire fighters are etc.&lt;br /&gt;&lt;br /&gt;Part of the Windows 8 slate included a touch sensor. The concept is that two people are using an application and what to collaborate. So they physically touch there slates and an electronic handshake occurs that enables further communication over Bluetooth etc. This also works with sensors which I believe work by induction and need no battery. Another example is a business card that when touched opens a web browser to a website. Another example starts an application that if not present will install it first then run it.&lt;br /&gt;&lt;br /&gt;There is really a lot going on. I have met up with some HPC / Azure MVPs and discussed some of the problems that I encounted when making my cat model in the cload. Basically my problem was that I was not able to transfer a 60 GB VM into the cloud including a local SQL Server. The suggestion was to use SQL Azure and transfer data via blob storage. Also to think about TriadLinq which is a way to spread out queries onto multiple VMs. The thing is Azure is simply way cheaper than using in house servers. So I will attend some sessions that will look at these in a little more detail. On the Slate PC is a pre beta version of Windows 8 and Visual Studio 2011. I have also got an evaluation version of the SaaS version of Team Foundation Server 2010 which contains a lot of Application Lifecyle Management features that are all a part of professional software engineering.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-9097464382942957151?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/9097464382942957151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/9097464382942957151'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2011/09/first-impression-of-build.html' title='First Impression of the Build'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-5393554210522006809</id><published>2011-07-20T22:45:00.000-07:00</published><updated>2011-07-20T22:57:22.394-07:00</updated><title type='text'>Some notes on the application of Cloud computing</title><content type='html'>I am just about to go on holiday. So before I forget here are ideas about the application of Cloud Computing to Catastrophe Modeling. &lt;br /&gt;&lt;br /&gt;Cloud computing makes sense for Cat simulations for various reasons. The costs are very reasonable, for example all my tests came to about 82 CHF compared to the fixed cost of a VM in a datacenter that mounts up to several thousand franks. Microsoft can achieve this by making the administration of the hundreds of thousands of VMs as automated as possible thus getting an economy of scale that we don't have in smaller data centers. Creating the cloud VMs took a few minutes as opposed to weeks via our internal/external processes. I could imagine that WMWare will improve the provisioning of virtual machines and that one day this may be as simple as filling out a web site. But we don't have such a system yet and if we did we would have a much more limited pool of servers and therefore higher costs than if the whole thing was in the cloud. One last aspect was that surprisingly the end to end time to process the bench mark cat model in the cloud took less time than on our on-premis servers. &lt;br /&gt;&lt;br /&gt;There are some different possibilities how number crunching processes can be implemented. I have seen solutions that can call an executable, if this executable needs something to be installed on the machine it is possible to configure setup tasks that install software as the VM is being instantiated. In the context of my modeling platform I think I would implement the job submission in the same way as in the prototype I described earlier. By this I mean I would transfer the data to be simulated as a blob and once completed add a reference to this data in a Queue that the work roles pole for work. The difference would be instead of poling the results queue I would expose an on premise WCF service over http and call this from the cload using claims based tokens. I would use Queues for status information because they have an intrinsic order, but I would send this information via one way calls to the on premise web services. Since security is made using claims based security the role of the firewall changes slightly. The reason is that cloud apps need to connect via http or https to internal services and that the services and not the firewall will carry out authentication. So there is a shift of responsibility from the firewall the services&lt;br /&gt;&lt;br /&gt;From my experience of uploading custom VMs into the cloud I am not sure how well HPC with burst into Azure works in practice. I will follow up on this at the Build conference.&lt;br /&gt;&lt;br /&gt;Thinking about how Cloud computing can be integrated into an organization there are 3 aspects to consider Network, Storage and Compute.&lt;br /&gt;&lt;br /&gt;A means of synchronizing data between office and mobiles devices brings substantial benefits. Some years ago I tried a CTP of Microsoft Mesh which enabled the synchronization of data between devices. Apple recently released a similar cloud service. There was a demo at the PDC which showed a business man losing his PC but because all his configuration and working data is continuously in synch it was possible to take a new PC and carry on where he left off. Since the CTP I have seen a version of Mesh in Hotmail and Office 360. Although it is difficult to come up with a single business case where this is useful it does add to productivity because it improves the functionality of the environment that we work in.&lt;br /&gt;&lt;br /&gt;On the network idea there are datacenters around the world making a global presence much easier to maintain. On the other hand there is latency in getting data to and from the cloud. This makes the SaaS Team Foundation Server offering very interesting.&lt;br /&gt;&lt;br /&gt;I think cloud computing will bring about a shift from relational databases to a more object orientated data storage model. Relational databases are not intrinsically more performant. At present I believe the performance of properly dimensioned on premise sql servers out-perform the cloud sql servers. This will probably change SQL Azure developes and as technologies like TriadLinq become available enabling the distribution of the workload needed in carrying out database queries. The reason is that a central sql server is a bottle neck, where as in a cloud the compute needed to carry out queries is by design made for scalability. &lt;br /&gt;&lt;br /&gt;With this in mind I think it's worthwhile to encourage the development of web based apps or apps that can be deployed from the web because these fit easily into the Cloud. We would need to manage the scope of the broad set of mobile devices that may or may not be supported in our environment. In particular Rapid Application Development in the context of Microsoft orientated companies which would favor Windows mobile devices even though these devices have not been on the market long enough to really take a large market share. To develop iPad and iPhone applications means needing an Apple workstation learning C and a whole new API.&lt;br /&gt;&lt;br /&gt;When looking at data It is difficult to categorize data into security groups. The reason is that depending on the application the data either be sensitive or non sensitive depending on it's context. It is therefore more practical to make security groups for applications&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-5393554210522006809?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/5393554210522006809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/5393554210522006809'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2011/07/some-notes-on-application-of-cloud.html' title='Some notes on the application of Cloud computing'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-5086900088891220575</id><published>2011-06-09T09:02:00.001-07:00</published><updated>2011-06-09T09:02:12.223-07:00</updated><title type='text'>Parallel.For seems to have a large overhead compared to a simpler implementation</title><content type='html'>&lt;p&gt; I implemented the following alternative to the parallel for using threads: &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; static void MyParallelFor(int fromInclusive, int toExclusive, Action&amp;lt;int&amp;gt; body)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int numProcs = Environment.ProcessorCount;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (CountdownEvent ce = new CountdownEvent(numProcs))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int rangeSize = (toExclusive - fromInclusive) / numProcs;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (int p = 0; p&amp;lt; numProcs; p++)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int start = rangeSize * p;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //int end = start + rangeSize;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int end = p == numProcs-1 ? toExclusive : start + rangeSize;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ThreadPool.QueueUserWorkItem(delegate    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (int i = start; i &amp;lt; end; i++) body(i);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ce.Signal();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ce.Wait();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;I then tested this on the benchmark earthquake model as described in my last blog entry. Since the signature of the parallel for and myParallelFor are identical the comparison can be made by commenting out the implementation that is not under test. &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (i = 1; i &amp;lt;= ns; i++) // Outer loop going through lots of lines of exposure   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; loss[i] = 0; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Parallel.For(1, nr,   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MyParallelFor(1, nr, // Inner loop going through many events    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (jj) =&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Some maths to determine the mean damage ratio (see previous blog entry for details)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; localsum[jj] = mdr * value[jj];    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; loss[i] = localsum.Sum();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;I then ran the above code on a physical machine with ProLiant DL580 G5 12 Cores 2.66 GHz Intel Xeon(R) X7460 with 8188 MB RAM &lt;/p&gt;  &lt;p&gt;Parallel.For took about 114 seconds with all 12 CPUs running evenly at about 70%.   &lt;br /&gt;MyParallelFor took about 71 seconds with 11 CPUs at 30% and 1 CPU at 80%, &lt;/p&gt;  &lt;p&gt;I found this difference quite surprising as it seems that the parallel.for implementation in System.Threading.Tasks seems to have a very large overhead. Not only does it take longer but the cpu’s are working harder. Using reflector I could see that the implementation of private static ParallelLoopResult ForWorker was quite extensive. When I have some time I will add some buffering in the localsum to check whether the problem is caused by cache invalidation.&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-5086900088891220575?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/5086900088891220575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/5086900088891220575'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2011/06/parallelfor-seems-to-have-large.html' title='Parallel.For seems to have a large overhead compared to a simpler implementation'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-6171417817931823565</id><published>2011-05-27T11:03:00.001-07:00</published><updated>2011-05-27T11:03:42.632-07:00</updated><title type='text'>Results of runing a simplified earthquake model in the cloud</title><content type='html'>&lt;p&gt;Here are some preliminary results of how long it takes to upload and run 10000 iterations of a cat model under various worker role configurations&lt;/p&gt;  &lt;p&gt;Extra Large with 8 cores took 26s   &lt;br /&gt;Large with 4 cores took 34s    &lt;br /&gt;Medium with 2 cores took 49s    &lt;br /&gt;Small with 1 core took 82s&lt;/p&gt;  &lt;p&gt;For comparison here are some run times on a D20 desktop&lt;/p&gt;  &lt;p&gt;VB.NET on a D20 compiled with VS2010 running on 1 thread&amp;#160; took&amp;#160; 104s   &lt;br /&gt;F90 on a D20 compiled with Intel running on 1 thread took 162s    &lt;br /&gt;C++ on a D20 compiled with Intel with optimization on 1 thread took 58 s &lt;/p&gt;  &lt;p&gt;The time needed to upload exposure and events took about 100s Within the cloud it took about 1s to download from blob storage&lt;/p&gt;  &lt;p&gt;The initial flat file text files had the following sizes and number of points&lt;/p&gt;  &lt;p&gt;Exposure file 7.3MB&amp;#160;&amp;#160;&amp;#160; 385560 Points   &lt;br /&gt;Event Catalogue 4.8MB&amp;#160; 194510 Events &lt;/p&gt;  &lt;p&gt;To reduce the run times we reduced the number of events from 194510 to 10000. So this means the actual run times are 20 times longer.&lt;/p&gt;  &lt;p&gt;I have not received the bill for these tests but I think it is probably quite cheap. I think there is a lot to be said for cloud computing because I only had to worry about my code, the infrastructure was completely abstracted away. In fact setting up a new node takes about 8 minutes with a very friendly billing terms that you pay only for the time that the role is active.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-6171417817931823565?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/6171417817931823565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/6171417817931823565'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2011/05/results-of-runing-simplified-earthquake.html' title='Results of runing a simplified earthquake model in the cloud'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-1706420570870775042</id><published>2011-05-27T06:04:00.001-07:00</published><updated>2011-05-27T06:08:31.133-07:00</updated><title type='text'>Numerical calculations in Azure continued</title><content type='html'>&lt;p&gt;After some help from Steve Spencer I figured out the best way to debug the WorkerRole was not to do the whole thing in unit tests but to pressed the play button on the WorkerRole and use a unit test to feed it with data. It turned out the problem was within the blob storage code. I still have some work to refactor the worker role but I want to get some results so I am going to leave it as it is for the moment:&lt;/p&gt;  &lt;p&gt;using System;   &lt;br /&gt;using System.Collections.Generic;    &lt;br /&gt;using System.Diagnostics;    &lt;br /&gt;using System.Linq;    &lt;br /&gt;using System.Net;    &lt;br /&gt;using System.Threading;    &lt;br /&gt;using Microsoft.WindowsAzure;    &lt;br /&gt;using Microsoft.WindowsAzure.Diagnostics;    &lt;br /&gt;using Microsoft.WindowsAzure.ServiceRuntime;    &lt;br /&gt;using Microsoft.WindowsAzure.StorageClient;    &lt;br /&gt;using AzureHelper;    &lt;br /&gt;using System.Configuration;    &lt;br /&gt;using System.IO;    &lt;br /&gt;using System.Text;    &lt;br /&gt;using CatModel;    &lt;br /&gt;using Contracts;    &lt;br /&gt;using Entities;    &lt;br /&gt;using Infrastructure; &lt;/p&gt;  &lt;p&gt;namespace WorkerRole1   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class WorkerRole : RoleEntryPoint    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private String localPath;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private String calcsimExePath; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private EQModel eQModel { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private DateTime Start { get; set; }   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private DateTime Finish { get; set; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private TimeSpan Stopwatch { get; set; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public ILog Log { set; get; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private AzQueueHandler jobInputQueue;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private AzQueueHandler jobOutputQueue;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private AzQueueHandler jobLogQueue; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private AzBlobHandler jobInputBlog; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private AzBlobHandler dataStoreExposureX;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private AzBlobHandler dataStoreExposureY;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private AzBlobHandler dataStoreExposureV; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private AzBlobHandler dataStoreCatalogSm;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private AzBlobHandler dataStoreCatalogSx;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private AzBlobHandler dataStoreCatalogSy;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private AzBlobHandler dataStoreCatalogSd; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private AzBlobHandler jobLossBlob;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private AzBlobHandler jobLogBlob;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private AzBlobHandler jobOutputBlog; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private int idleCount;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private int idleMax;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private int idleSleepTime; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override bool OnStart()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Set the maximum number of concurrent connections     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ServicePointManager.DefaultConnectionLimit = 12; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // For information on handling configuration changes   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // see the MSDN topic at &lt;a href="http://go.microsoft.com/fwlink/?LinkId=166357"&gt;http://go.microsoft.com/fwlink/?LinkId=166357&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return base.OnStart();   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private void Init()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; idleCount = 0; // how many times the instance have been idle    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; idleMax = 10;&amp;#160;&amp;#160; // After 10 times (5 minutes = 30 secs *10) being idle, then die    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; idleSleepTime = 30 * 1000; // sleep for this number of seconds between each queue poll &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var accountName = ConfigurationManager.AppSettings[&amp;quot;AzureAccountName&amp;quot;];   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var accountKey = ConfigurationManager.AppSettings[&amp;quot;AzureAccountKey&amp;quot;]; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jobInputQueue = new AzQueueHandler(ConfigurationManager.AppSettings[&amp;quot;JobInputQueue&amp;quot;], accountName, accountKey);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jobOutputQueue = new AzQueueHandler(ConfigurationManager.AppSettings[&amp;quot;JobOutputQueue&amp;quot;], accountName, accountKey);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jobLogQueue = new AzQueueHandler(ConfigurationManager.AppSettings[&amp;quot;JobLogQueue&amp;quot;], accountName, accountKey);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jobInputBlog = new AzBlobHandler(ConfigurationManager.AppSettings[&amp;quot;JobInputBlob&amp;quot;], accountName, accountKey); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jobLogBlob = new AzBlobHandler(ConfigurationManager.AppSettings[&amp;quot;jobLogBlob&amp;quot;], accountName, accountKey);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreExposureX = new AzBlobHandler(ConfigurationManager.AppSettings[&amp;quot;dataStoreExposureX&amp;quot;], accountName, accountKey);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreExposureY = new AzBlobHandler(ConfigurationManager.AppSettings[&amp;quot;dataStoreExposureY&amp;quot;], accountName, accountKey);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreExposureV = new AzBlobHandler(ConfigurationManager.AppSettings[&amp;quot;dataStoreExposureV&amp;quot;], accountName, accountKey); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSm = new AzBlobHandler(ConfigurationManager.AppSettings[&amp;quot;dataStoreCatalogSm&amp;quot;], accountName, accountKey);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSx = new AzBlobHandler(ConfigurationManager.AppSettings[&amp;quot;dataStoreCatalogSx&amp;quot;], accountName, accountKey);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSy = new AzBlobHandler(ConfigurationManager.AppSettings[&amp;quot;dataStoreCatalogSy&amp;quot;], accountName, accountKey);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSd = new AzBlobHandler(ConfigurationManager.AppSettings[&amp;quot;dataStoreCatalogSd&amp;quot;], accountName, accountKey); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jobLossBlob = new AzBlobHandler(ConfigurationManager.AppSettings[&amp;quot;JobLossBlob&amp;quot;], accountName, accountKey);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jobOutputBlog = new AzBlobHandler(ConfigurationManager.AppSettings[&amp;quot;JobOutputBlob&amp;quot;], accountName, accountKey); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; eQModel = new EQModel();   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Log = new Log(&amp;quot;WorkerRole&amp;quot;); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; localPath = Environment.CurrentDirectory; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // pull EXE file from blob storage to local file system   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; calcsimExePath = System.IO.Path.Combine(localPath, &amp;quot;Startup\\calcsim.exe&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void Run()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // This is a sample worker implementation. Replace with your logic.    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Trace.WriteLine(&amp;quot;WorkerRole1 entry point called&amp;quot;, &amp;quot;Information&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Init(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TraceInfo(&amp;quot;AzJobHost::Run() Azure Instance ID {0}, DeploymentId {1}&amp;quot;, RoleEnvironment.CurrentRoleInstance.Id, RoleEnvironment.DeploymentId); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; bool more = true;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Stopwatch swWrkRoleLifetime = Stopwatch.StartNew(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // msg pump loop   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string id = &amp;quot;&amp;quot;; string popId = &amp;quot;&amp;quot;;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while (more)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; id = &amp;quot;&amp;quot;; popId = &amp;quot;&amp;quot;;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string msg = jobInputQueue.GetMessage(ref id, ref popId, false); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (msg == null)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; idleCount++;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (idleCount &amp;gt;= idleMax)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; more = false;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else Thread.Sleep(idleSleepTime);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ProcessMsg(id, popId, msg);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //swWrkRoleLifetime.Stop();   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //TraceInfo(&amp;quot;AzJobHost::Exit(). Execution time {0}&amp;quot;, swWrkRoleLifetime.Elapsed);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private bool ProcessMsg(string id, string popId, string msg)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; bool rc = true; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Stopwatch sw = Stopwatch.StartNew();   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TraceInfo(&amp;quot;AzJobHost::ProcessMsg( '{0}', '{1}') - Azure Instance Id: {2}&amp;quot;, id, msg, RoleEnvironment.CurrentRoleInstance.Id); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;double&amp;gt; x = new List&amp;lt;double&amp;gt;();   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;double&amp;gt; y = new List&amp;lt;double&amp;gt;();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;double&amp;gt; v = new List&amp;lt;double&amp;gt;();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;double&amp;gt; sm = new List&amp;lt;double&amp;gt;();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;double&amp;gt; sx = new List&amp;lt;double&amp;gt;();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;double&amp;gt; sy = new List&amp;lt;double&amp;gt;();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;double&amp;gt; sd = new List&amp;lt;double&amp;gt;(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Start = DateTime.Now;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreExposureX.RecieveDataFromStorage&amp;lt;double&amp;gt;(msg, out x);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreExposureY.RecieveDataFromStorage&amp;lt;double&amp;gt;(msg, out y);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreExposureV.RecieveDataFromStorage&amp;lt;double&amp;gt;(msg, out v);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Finish = DateTime.Now;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Stopwatch = Finish.Subtract(Start);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Log.LogMessage(String.Format(&amp;quot;Time to Upload Exposure to model {0} milliseconds&amp;quot;,&amp;#160; Stopwatch.TotalMilliseconds), Stopwatch.TotalMilliseconds); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Start = DateTime.Now;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSm.RecieveDataFromStorage&amp;lt;double&amp;gt;(msg, out sm);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSx.RecieveDataFromStorage&amp;lt;double&amp;gt;(msg, out sx);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSy.RecieveDataFromStorage&amp;lt;double&amp;gt;(msg, out sy);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSd.RecieveDataFromStorage&amp;lt;double&amp;gt;(msg, out sd); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Finish = DateTime.Now;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Stopwatch = Finish.Subtract(Start);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Log.LogMessage(String.Format(&amp;quot;Time to Upload Catalog to model {0} milliseconds&amp;quot;, Stopwatch.TotalMilliseconds), Stopwatch.TotalMilliseconds); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;double&amp;gt; losses = new List&amp;lt;double&amp;gt;(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Start = DateTime.Now;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; eQModel.RunModel(x, y, v, sm, sx, sy, sd, out losses);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Finish = DateTime.Now;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Stopwatch = Finish.Subtract(Start);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Log.LogMessage(String.Format(&amp;quot;Time to Run Japan Earthquake {0} milliseconds&amp;quot;, Stopwatch.TotalMilliseconds), Stopwatch.TotalMilliseconds); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Log.LogMessage(&amp;quot;=== Appending Model Log to Server Log ====&amp;quot;); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;LogEvent&amp;gt; ModelLogs = eQModel.log.GetLogs();   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Log.Add(ModelLogs); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jobLossBlob.SendDataToStorage&amp;lt;double&amp;gt;(msg, losses);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jobLogBlob.SendDataToStorage&amp;lt;LogEvent&amp;gt;(msg, this.Log.GetLogs()); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jobOutputQueue.PutMessage(msg); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jobInputQueue.DeleteMessage(id, popId);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return rc;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private void TraceInfo(string format, params object[] args)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string msg = string.Format(format, args);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Trace.WriteLine(msg, &amp;quot;Information&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // If a configuration setting is changing    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (e.Changes.Any(change =&amp;gt; change is RoleEnvironmentConfigurationSettingChange))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Set e.Cancel to true to restart this role instance    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; e.Cancel = true;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TraceInfo(&amp;quot;AzJobHost::UnhandledException: &amp;quot; + (Exception)e.ExceptionObject);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RoleEnvironment.RequestRecycle();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; }   &lt;br /&gt;}&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-1706420570870775042?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/1706420570870775042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/1706420570870775042'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2011/05/numerical-calculations-in-azure_27.html' title='Numerical calculations in Azure continued'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-6831586583914496793</id><published>2011-05-26T12:15:00.001-07:00</published><updated>2011-05-27T02:38:25.965-07:00</updated><title type='text'>Numerical calculations in Azure</title><content type='html'>&lt;p&gt;Here are the steps that I took in looking at Azure and getting a feel for how we could use this. Recently we have made a number of bench mark tests with a simplified Japan earthquake model. This seems a natural place to start. The idea would be to utilize the compute power of the cloud to make earthquake simulations. Here some pseudo code as to what I intend to do &lt;/p&gt;  &lt;p&gt;1.&amp;#160;&amp;#160;&amp;#160; The client loads exposure into cloud storage    &lt;br /&gt;2.&amp;#160;&amp;#160;&amp;#160; The client loads earthquake catalog into cloud storage     &lt;br /&gt;3.&amp;#160;&amp;#160;&amp;#160; The client adds a reference to the exposure and earthquake catalogue data to a queue     &lt;br /&gt;4.&amp;#160;&amp;#160;&amp;#160; The worker node listens on the input queue     &lt;br /&gt;5.&amp;#160;&amp;#160;&amp;#160; The worker node dequeues a reference to data for download     &lt;br /&gt;6.&amp;#160;&amp;#160;&amp;#160; The worker node downloads data from cloud storage     &lt;br /&gt;7.&amp;#160;&amp;#160;&amp;#160; The worker node processes the data     &lt;br /&gt;8.&amp;#160;&amp;#160;&amp;#160; The worker node saves loss data using a reference     &lt;br /&gt;9.&amp;#160;&amp;#160;&amp;#160; The worker node adds a reference to the loss data to a queue     &lt;br /&gt;10.&amp;#160;&amp;#160;&amp;#160; The client listens on the output queue     &lt;br /&gt;11.&amp;#160;&amp;#160;&amp;#160; The client dequeues the reference to result data     &lt;br /&gt;12.&amp;#160;&amp;#160;&amp;#160; The client downloads results and logs &lt;/p&gt;  &lt;p&gt;Looking at this sequence the first thing I want to do is to be able to make CRUD operations on Queues and blobs. I found some good examples how this could be done, but I wanted to extend these examples to be more generic. Here's a handy generic function that sends lists of serializable objects to and from blob storage. &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void RecieveDataFromStorage&amp;lt;T&amp;gt;(string key, out List&amp;lt;T&amp;gt; data)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CloudBlobContainer container = _blobClient.GetContainerReference(_blobContainer.Name);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CloudBlob blob = container.GetBlobReference( key);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; byte[] bdata = blob.DownloadByteArray(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MemoryStream f = new MemoryStream();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BinaryFormatter sf = new BinaryFormatter();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; f.Write(bdata, 0, bdata.Length);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; f.Flush();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;T&amp;gt; target = new List&amp;lt;T&amp;gt;();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; f.Position = 0; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; target = (List&amp;lt;T&amp;gt;)sf.Deserialize(f);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; data = target;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void SendDataToStorage&amp;lt;T&amp;gt;(string key, List&amp;lt;T&amp;gt; data)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CloudBlobContainer container = _blobClient.GetContainerReference(_blobContainer.Name);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CloudBlob blob = container.GetBlobReference(key); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MemoryStream f = new MemoryStream();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BinaryFormatter sf = new BinaryFormatter();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; sf.Serialize(f, data);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; f.Position = 0;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; byte[] bdata = f.ToArray(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; blob.UploadByteArray(bdata);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;Where T can be any serializable entity. With these functions we have an easy way to transfer data too and from the cloud storage. &lt;/p&gt;  &lt;p&gt;Next step is that we want to do some calculations. The simplified japan earthquake algorithm is single threaded. In order to make use of various number of processors we need to make this multi core enabled. Normally when making an algorithm multicore enabled you need to first really understand what is the algorithm trying to do. Then the next step is to think still in the problem domain how to split the work, fore example by data or by process. Then this is reviewed in the context of the hardware and technology available. Finally you would code applying patterns that do things like take account of cache invalidation etc. In our case we just want to get a feeling for what various CPU configurations can bring. Therefore I just made the inner loop parallel. The algorithm falls under the cataegory of &amp;quot;embarrasingly parrallizable code&amp;quot; because the loops are allmost completely independent from each other, only the line highlighted in bold has some cross dependancies. The trick is how to sum the losses. Below is the code before and after… &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (i = 1; i &amp;lt;= ns; i++)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; loss[i] = 0; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ((sm[i] &amp;gt; 3))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dkrit = 0.5 * sm[i] * sm[i] * sm[i]; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (j = 1; j &amp;lt;= nr; j++)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; rr[j] = 0.001 * Math.Sqrt((sx[i] - rx[j]) * (sx[i] - rx[j]) + (sy[i] - ry[j]) * (sy[i] - ry[j]));     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; rr[j] = Math.Sqrt(sd[i] * sd[i] + rr[j] * rr[j]); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ((rr[j] &amp;lt; dkrit))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; rlog[j] = Math.Log(rr[j]);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mmi[j] = 981 * Math.Exp(c1 + c2 * sm[i] + c3 * sm[i] * sm[i] + c4 * rlog[j] + c5 * rr[j]);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ((mmi[j] &amp;gt; 50))     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mmi[j] = 3.66 * Math.Log10(mmi[j]) - 1.66;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lmmi = Math.Log(mmi[j]);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mdr[j] = 0.01 * Math.Exp(v1 * lmmi * lmmi + v2 * lmmi + v3);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; loss[i] = loss[i] + mdr[j] * value[j]; // &amp;lt;----------     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Parallel.For(1, nr,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (jj) =&amp;gt; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //rr[jj] = 0.001 * Math.Sqrt((sx[i] - rx[jj]) * (sx[i] - rx[jj]) + (sy[i] - ry[jj]) * (sy[i] - ry[jj]));     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; double rr = 0.001 * Math.Sqrt((sx[i] - rx[jj]) * (sx[i] - rx[jj]) + (sy[i] - ry[jj]) * (sy[i] - ry[jj]));     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // rr[jj] = Math.Sqrt(sd[i] * sd[i] + rr[jj] * rr[jj]);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; rr = Math.Sqrt(sd[i] * sd[i] + rr * rr);;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ((rr &amp;lt; dkrit))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //rlog[jj] = Math.Log(rr[jj]);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; double rlog = Math.Log(rr);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //mmi[jj] = 981 * Math.Exp(c1 + c2 * sm[i] + c3 * sm[i] * sm[i] + c4 * rlog[jj] + c5 * rr[jj]);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; double mmi = 981 * Math.Exp(c1 + c2 * sm[i] + c3 * sm[i] * sm[i] + c4 * rlog + c5 * rr);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if ((mmi &amp;gt; 50))     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //mmi[jj] = 3.66 * Math.Log10(mmi[jj]) - 1.66;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mmi = 3.66 * Math.Log10(mmi) - 1.66;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lmmi = Math.Log(mmi);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //mdr[jj] = 0.01 * Math.Exp(v1 * lmmi * lmmi + v2 * lmmi + v3);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; double mdr = 0.01 * Math.Exp(v1 * lmmi * lmmi + v2 * lmmi + v3);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; localsum[jj] = mdr * value[jj];     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; loss[i] = localsum.Sum(); &lt;/p&gt;  &lt;p&gt;There is a lot of scope for further optimization for example we could add a buffer into localsum to account for cache invalidation. Here's an example of what I did with the base class. &lt;/p&gt;  &lt;p&gt;using System;    &lt;br /&gt;using System.Collections.Generic;     &lt;br /&gt;using System.Linq;     &lt;br /&gt;using System.Text;     &lt;br /&gt;using Contracts;     &lt;br /&gt;using Entities; &lt;/p&gt;  &lt;p&gt;namespace Contracts    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public abstract class JobProcessorBase : IJobProcessor     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private DateTime Start { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private DateTime Finish { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private TimeSpan Stopwatch { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public List&amp;lt;double&amp;gt; LossList { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public ILog Log { set; get; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public StorageType StorageType { get; private set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void ProcessJob()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string key = &amp;quot;&amp;quot;;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TimedAction(() =&amp;gt; key = DequeueAndDeleteKey(), &amp;quot;GetExposure&amp;quot;); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.StorageType = StorageType.None;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (key.ToLower().IndexOf(&amp;quot;blob&amp;quot;) == 0)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.StorageType = StorageType.Blob;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TimedAction(() =&amp;gt; GetExposure(key), &amp;quot;GetExposure&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TimedAction(() =&amp;gt; GetEventCatalogue(key), &amp;quot;GetEventCatalogue&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TimedAction(() =&amp;gt; RunModel(), &amp;quot;RunModel&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TimedAction(() =&amp;gt; SaveLosses(key), &amp;quot;SaveLosses&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TimedAction(() =&amp;gt; SaveLog(key), &amp;quot;SaveLog&amp;quot;); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private void TimedAction(Action ToDo, string MethodName)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Start = DateTime.Now;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ToDo.Invoke();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Finish = DateTime.Now;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Stopwatch = Finish.Subtract(Start);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Log.LogMessage(String.Format(&amp;quot;Time to {0} {1} milliseconds&amp;quot;,MethodName, Stopwatch.TotalMilliseconds), Stopwatch.TotalMilliseconds);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public abstract string DequeueAndDeleteKey();&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public abstract void GetExposure(string key);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public abstract void GetEventCatalogue(string key);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public abstract void RunModel();&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public abstract void SaveLosses(string key);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public abstract void SaveLog(string key);&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;Next I started to implement the base classes that implements a template method pattern that times each individual step. In the true spirit of test driven development I build slowly an end to end test that loaded the data ran the model and downloaded the results. &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [TestMethod]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void RunBlobModel()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BlobJobDispatcher blobJobDispatcher = new BlobJobDispatcher();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string key = &amp;quot;&amp;quot;; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Load data into Cload    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; blobJobDispatcher.CreateJob(out key); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Pretend to be the Worker Role    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; LoadData loadData = new LoadData();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; JobProcessor jobProcessor = new JobProcessor(loadData);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jobProcessor.ProcessJob(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Recieve results back from the cload    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; blobJobDispatcher.RecieveResults(out key);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;Here's how the client implementation looked like: &lt;/p&gt;  &lt;p&gt;namespace Client    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class BlobJobDispatcher : JobDispatcherBase     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IJobProcessor JobProcessor;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private LoadData loadData { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IDataStore dataStoreExposureX { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IDataStore dataStoreExposureY { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IDataStore dataStoreExposureV { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private QueueStorage dataStoreExposureQueue { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IDataStore dataStoreCatalogSm { get; set; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IDataStore dataStoreCatalogSx { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IDataStore dataStoreCatalogSy { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IDataStore dataStoreCatalogSd { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private QueueStorage dataStoreCatalogQueue { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private QueueStorage jobQueue { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private QueueStorage resultsQueue { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IDataStore dataStoreLosses { get; set; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IDataStore dataStoreLog { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public BlobJobDispatcher()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.ClientLog = new Log(&amp;quot;BlobJobDispatcher&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; loadData = new LoadData();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string storageConnectionString = ConfigurationManager.ConnectionStrings[&amp;quot;Storage&amp;quot;].ConnectionString;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreExposureX = new BlobStorage(storageConnectionString, &amp;quot;exposurex&amp;quot;, false);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreExposureY = new BlobStorage(storageConnectionString, &amp;quot;exposurey&amp;quot;, false);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreExposureV = new BlobStorage(storageConnectionString, &amp;quot;exposurev&amp;quot;, false);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreExposureQueue = new QueueStorage(storageConnectionString, &amp;quot;exposurequeue&amp;quot;, true); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSm = new BlobStorage(storageConnectionString, &amp;quot;catalogsm&amp;quot;, false);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSx = new BlobStorage(storageConnectionString, &amp;quot;catalogsx&amp;quot;, false);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSy = new BlobStorage(storageConnectionString, &amp;quot;catalogsy&amp;quot;, false);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSd = new BlobStorage(storageConnectionString, &amp;quot;catalogsd&amp;quot;, false);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogQueue = new QueueStorage(storageConnectionString, &amp;quot;catalogqueue&amp;quot;, true); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jobQueue = new QueueStorage(storageConnectionString, &amp;quot;jobqueue&amp;quot;, true); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resultsQueue = new QueueStorage(storageConnectionString, &amp;quot;resultsqueue&amp;quot;, true);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreLosses = new BlobStorage(storageConnectionString, &amp;quot;catalogsd&amp;quot;, false);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreLog = new BlobStorage(storageConnectionString, &amp;quot;log&amp;quot;, false);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region JobDispatcherBase Members &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void ReadExposure()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; loadData.ReadExposure();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void ReadEventCatalogue()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; loadData.ReadEventCatalogue();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void SendExposureToCload(string key)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.dataStoreExposureX.SendDataToStorage&amp;lt;double&amp;gt;(key, this.loadData.rxList);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.dataStoreExposureY.SendDataToStorage&amp;lt;double&amp;gt;(key, this.loadData.ryList);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.dataStoreExposureV.SendDataToStorage&amp;lt;double&amp;gt;(key, this.loadData.valueList);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.dataStoreExposureQueue.SendDataToStorage(key);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void SendEventCatalogueToCload(string key)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSm.SendDataToStorage&amp;lt;double&amp;gt;(key, this.loadData.smList);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSx.SendDataToStorage&amp;lt;double&amp;gt;(key, this.loadData.sxList);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSy.SendDataToStorage&amp;lt;double&amp;gt;(key, this.loadData.syList);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSd.SendDataToStorage&amp;lt;double&amp;gt;(key, this.loadData.sdList);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.dataStoreCatalogQueue.SendDataToStorage(key);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void SubmitJobToCload(string key)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jobQueue.SendDataToStorage(key);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override string WaitForKey()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string recievedKey = &amp;quot;&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while (recievedKey == &amp;quot;&amp;quot;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resultsQueue.RecieveDataFromStorage(out recievedKey);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Thread.Sleep(1000);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return recievedKey;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override List&amp;lt;double&amp;gt; GetLossListFromCloud(string key)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;double&amp;gt; recievedLosses = new List&amp;lt;double&amp;gt;();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreLosses.RecieveDataFromStorage&amp;lt;double&amp;gt;(key,out recievedLosses);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return recievedLosses;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override List&amp;lt;LogEvent&amp;gt; GetLogsFromCloud(string key)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;LogEvent&amp;gt; recievedLogs = new List&amp;lt;LogEvent&amp;gt;();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreLog.RecieveDataFromStorage&amp;lt;LogEvent&amp;gt;(key, out recievedLogs);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return recievedLogs;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void PersistLogs()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.ClientLog.Save(&amp;quot;C:\\Azure\\PartnerRe\\CloudInfra\\Data\\FlatFileLogg.txt&amp;quot;,false);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void PersistLossList()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; StreamWriter FileOut = new StreamWriter(&amp;quot;C:\\Azure\\PartnerRe\\CloudInfra\\Data\\LossFile.txt&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach (double l in LossList)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FileOut.WriteLine(string.Format(&amp;quot;{0}&amp;quot;, l));     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FileOut.Close();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;Here's how the server side implementation looked like &lt;/p&gt;  &lt;p&gt;namespace Server    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; JobProcessor : JobProcessorBase     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public LoadData loadData {get; set;} &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private EQModel eQModel { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IDataStore dataStoreExposureX { get; set; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IDataStore dataStoreExposureY { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IDataStore dataStoreExposureV { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private QueueStorage dataStoreExposureQueue { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IDataStore dataStoreCatalogSm { get; set; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IDataStore dataStoreCatalogSx { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IDataStore dataStoreCatalogSy { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IDataStore dataStoreCatalogSd { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private QueueStorage dataStoreCatalogQueue { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private QueueStorage jobQueue { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private QueueStorage resultsQueue { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IDataStore dataStoreLosses { get; set; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IDataStore dataStoreLog { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public JobProcessor(LoadData LoadData)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.loadData = LoadData;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Log = new Log(&amp;quot;FlatFileJobProcessor&amp;quot;);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; eQModel = new EQModel(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string storageConnectionString = ConfigurationManager.ConnectionStrings[&amp;quot;Storage&amp;quot;].ConnectionString;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreExposureX = new BlobStorage(storageConnectionString, &amp;quot;exposurex&amp;quot;, false);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreExposureY = new BlobStorage(storageConnectionString, &amp;quot;exposurey&amp;quot;, false);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreExposureV = new BlobStorage(storageConnectionString, &amp;quot;exposurev&amp;quot;, false);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreExposureQueue = new QueueStorage(storageConnectionString, &amp;quot;exposurequeue&amp;quot;, false); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSm = new BlobStorage(storageConnectionString, &amp;quot;catalogsm&amp;quot;, false);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSx = new BlobStorage(storageConnectionString, &amp;quot;catalogsx&amp;quot;, false);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSy = new BlobStorage(storageConnectionString, &amp;quot;catalogsy&amp;quot;, false);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSd = new BlobStorage(storageConnectionString, &amp;quot;catalogsd&amp;quot;, false);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogQueue = new QueueStorage(storageConnectionString, &amp;quot;catalogqueue&amp;quot;, false); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jobQueue = new QueueStorage(storageConnectionString, &amp;quot;jobqueue&amp;quot;, false); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; resultsQueue = new QueueStorage(storageConnectionString, &amp;quot;resultsqueue&amp;quot;, false);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreLosses = new BlobStorage(storageConnectionString, &amp;quot;joblossblob&amp;quot;, false);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreLog = new BlobStorage(storageConnectionString, &amp;quot;log&amp;quot;, false); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override string DequeueAndDeleteKey()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string recievedKey = &amp;quot;&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; while (recievedKey == &amp;quot;&amp;quot;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; jobQueue.RecieveDataFromStorage(out recievedKey);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (recievedKey == &amp;quot;&amp;quot;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Thread.Sleep(1000);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return recievedKey;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void GetExposure(string key)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch ( this.StorageType)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case StorageType.None:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case StorageType.Blob:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;double&amp;gt; recievedx = new List&amp;lt;double&amp;gt;();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;double&amp;gt; recievedy = new List&amp;lt;double&amp;gt;();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;double&amp;gt; recievedv = new List&amp;lt;double&amp;gt;(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreExposureX.RecieveDataFromStorage&amp;lt;double&amp;gt;(key, out recievedx);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreExposureY.RecieveDataFromStorage&amp;lt;double&amp;gt;(key, out recievedy);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreExposureV.RecieveDataFromStorage&amp;lt;double&amp;gt;(key, out recievedv); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.loadData.rxList = recievedx;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.loadData.ryList = recievedy;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.loadData.valueList = recievedv; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case StorageType.SQLAzure:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case StorageType.Table:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void GetEventCatalogue(string key)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch (this.StorageType)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case StorageType.None:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case StorageType.Blob: &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;double&amp;gt; recievedsm = new List&amp;lt;double&amp;gt;();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;double&amp;gt; recievedsx = new List&amp;lt;double&amp;gt;();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;double&amp;gt; recievedsy = new List&amp;lt;double&amp;gt;();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;double&amp;gt; recievedsd = new List&amp;lt;double&amp;gt;(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSm.RecieveDataFromStorage&amp;lt;double&amp;gt;(key, out recievedsm);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSx.RecieveDataFromStorage&amp;lt;double&amp;gt;(key, out recievedsx);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSy.RecieveDataFromStorage&amp;lt;double&amp;gt;(key, out recievedsy);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dataStoreCatalogSd.RecieveDataFromStorage&amp;lt;double&amp;gt;(key, out recievedsd); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.loadData.sxList = recievedsx;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.loadData.syList = recievedsy;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.loadData.smList= recievedsm;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.loadData.sdList = recievedsd;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case StorageType.SQLAzure:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case StorageType.Table:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void RunModel()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Log.LogMessage(&amp;quot;Start earthquake model&amp;quot;); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;double&amp;gt; result = new List&amp;lt;double&amp;gt;(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; eQModel.RunModel(loadData.rxList,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; loadData.ryList,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; loadData.valueList,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; loadData.smList,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; loadData.sxList,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; loadData.syList,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; loadData.sdList,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; out result);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.LossList = result; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Log.LogMessage(&amp;quot;=== Appending Model Log to Server Log ====&amp;quot;); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;LogEvent&amp;gt; ModelLogs = eQModel.log.GetLogs();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Log.Add(ModelLogs); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void SaveLosses(string key)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch (this.StorageType)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case StorageType.None:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case StorageType.Blob:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.dataStoreLosses.SendDataToStorage&amp;lt;double&amp;gt;(key,this.LossList);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.resultsQueue.SendDataToStorage(key);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case StorageType.SQLAzure:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case StorageType.Table:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void SaveLog(string key)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch (this.StorageType)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case StorageType.None:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case StorageType.Blob:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.dataStoreLog.SendDataToStorage&amp;lt;LogEvent&amp;gt;(key,this.Log.GetLogs());     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case StorageType.SQLAzure:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case StorageType.Table:     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;And the unit test worked. My next step was implement a worker role that executes the ProcessJob method and to change the unit test to look like &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [TestMethod]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void RunBlobModel()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BlobJobDispatcher blobJobDispatcher = new BlobJobDispatcher();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string key = &amp;quot;&amp;quot;;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; blobJobDispatcher.CreateJob(out key);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //LoadData loadData = new LoadData();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //JobProcessor jobProcessor = new JobProcessor(loadData);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //jobProcessor.ProcessJob(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; blobJobDispatcher.RecieveResults(out key);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;I thought that making the last step of replacing the processing part with a Worker role would be a trivial step. But it wasn’t. My main problem was that when I published my worker role the role would not start. As far as I can see there are no logs to help figure out what is going wrong. So instead I found an example of a worker role that was deployable and slowly refactored this to be in a state where it would process my earthquake models. This is quite a slow process because each time I want to test if the worker role can be deployed it took around 9 minutes. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-6831586583914496793?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/6831586583914496793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/6831586583914496793'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2011/05/numerical-calculations-in-azure.html' title='Numerical calculations in Azure'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-506728825764567302</id><published>2011-03-29T07:12:00.000-07:00</published><updated>2011-03-29T07:23:13.965-07:00</updated><title type='text'>EF4 and bulk delete</title><content type='html'>&lt;P&gt;&lt;br /&gt;When you want to delete records in EF4 typically you load the objects and delete them in the database context. This is a little slow. Microsoft recommends in such cases to use a stored procedure which I find not so cool. Here is an alternative way of doing this:&lt;br /&gt;&lt;/P&gt;&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;        public void DeleteAll&lt;TEntity&gt;(IQueryable&lt;TEntity&gt; clause) where TEntity : class&lt;br /&gt;        {&lt;br /&gt;            string sqlClause = GetClause&lt;TEntity&gt;(clause);&lt;br /&gt;            this.context.ExecuteStoreCommand(string.Format(CultureInfo.InvariantCulture, "DELETE {0}", sqlClause));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        private string GetClause&lt;TEntity&gt;(IQueryable&lt;TEntity&gt; clause) where TEntity : class&lt;br /&gt;        {&lt;br /&gt;            string snippet = "FROM [dbo].[";&lt;br /&gt;&lt;br /&gt;            string sql = ((ObjectQuery&lt;TEntity&gt;)clause).ToTraceString();&lt;br /&gt;            string sqlFirstPart = sql.Substring(sql.IndexOf(snippet));&lt;br /&gt;&lt;br /&gt;            sqlFirstPart = sqlFirstPart.Replace("AS [Extent1]", "");&lt;br /&gt;            sqlFirstPart = sqlFirstPart.Replace("[Extent1].", "");&lt;br /&gt;&lt;br /&gt;            // The above code works well for clauses like&lt;br /&gt;            //     IQueryable&lt;LossFile&gt; clause = this.databaseContext.Query&lt;LossFile&gt;().Where&lt;LossFile&gt;(v =&gt; v.ModelRunId == 1);&lt;br /&gt;            // BUT as soon as you replace "v =&gt; v.ModelRunId == 1" with "v =&gt; v.ModelRunId == myId" you will get sql looking like:&lt;br /&gt;            // "SELECT \r\n[Extent1].[LOSS_FILE_ID] AS [LOSS_FILE_ID], \r\n ...WHERE [Extent1].[MODEL_RUN_ID] = @p__linq__0"&lt;br /&gt;            // To evaluate @p__linq__0 you need to use the code below:&lt;br /&gt;            foreach (ObjectParameter Param in (((ObjectQuery&lt;TEntity&gt;)clause)).Parameters) {&lt;br /&gt;                switch (Param.ParameterType.FullName)&lt;br /&gt;                {&lt;br /&gt;                    case "System.Int32":&lt;br /&gt;                        sqlFirstPart = sqlFirstPart.Replace("@"+Param.Name, Param.Value.ToString());&lt;br /&gt;                        break;&lt;br /&gt;                    case "System.String":&lt;br /&gt;                        sqlFirstPart = sqlFirstPart.Replace("@"+Param.Name, "'"+Param.Value.ToString().Replace("'","''")+"'");&lt;br /&gt;                        break;&lt;br /&gt;&lt;br /&gt;                    default:&lt;br /&gt;                        throw new NotImplementedException("Parameter conversion for this type is not yet implemented");&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            return sqlFirstPart;&lt;br /&gt;        }&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;P&gt;&lt;br /&gt;Now the delete command can be called using a fluent linq clause in the following way:&lt;br /&gt;&lt;/P&gt;&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;            IQueryable&lt;LossFile&gt; clause = this.databaseContext.Query&lt;LossFile&gt;().Where&lt;LossFile&gt;(v =&gt; v.ModelRunId.Value == ModelRunId);&lt;br /&gt;            this.databaseContext.DeleteAll&lt;LossFile&gt;(clause);&lt;br /&gt;&lt;/PRE&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-506728825764567302?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/506728825764567302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/506728825764567302'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2011/03/ef4-and-bulk-delete.html' title='EF4 and bulk delete'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-6560493852437869566</id><published>2011-03-10T10:42:00.000-08:00</published><updated>2011-03-10T13:10:07.614-08:00</updated><title type='text'>Paired programming: How to use Data Annotations in WPF without throwing Validation exceptions</title><content type='html'>&lt;p&gt;&lt;br /&gt;We want to add simple data validation rules directly on the property within the view model. Data annotation provides attributes designed to do exactly this. There are some great websites that describe how to do this&lt;br /&gt;&lt;br /&gt;From http://msdn.microsoft.com/en-us/library/dd901590(v=vs.95).aspx we have a great example of how this is done in Silverlight using a sdk which includes a modified datagrid and a DescriptionViewer ( which I will return to later). Within this website we can find a wide range of simple validation attributes as illustrated in the sample shown below:&lt;br /&gt; &lt;/p&gt;&lt;br /&gt;    &lt;pre&gt;&lt;br /&gt;    public class Product&lt;br /&gt;    {&lt;br /&gt;        [Display(Name="Product Number")]&lt;br /&gt;        [Range(0, 5000)]&lt;br /&gt;        public int ProductID { get; set; }&lt;br /&gt;&lt;br /&gt;        [Display(Name="Name")]&lt;br /&gt;        [Required]&lt;br /&gt;        public string ProductName { get; set; }&lt;br /&gt;&lt;br /&gt;        [Display(Name="Price")]&lt;br /&gt;        [DataType(DataType.Currency)]&lt;br /&gt;        public double ListPrice { get; set; }&lt;br /&gt;&lt;br /&gt;        [EnumDataType(typeof(ProductColor))]&lt;br /&gt;        public ProductColor Color { get; set; }&lt;br /&gt;&lt;br /&gt;        [Display(Name="Available")]&lt;br /&gt;        public bool InStock { get; set; }&lt;br /&gt;&lt;br /&gt;        public Product() { }&lt;br /&gt;&lt;br /&gt;        public Product(int _productID, string _productName, &lt;br /&gt;            double _listPrice, ProductColor _color, bool _inStock)&lt;br /&gt;        {&lt;br /&gt;            this.ProductID = _productID;&lt;br /&gt;            this.ProductName = _productName;&lt;br /&gt;            this.ListPrice = _listPrice;&lt;br /&gt;            this.Color = _color;&lt;br /&gt;            this.InStock = _inStock;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;&lt;br /&gt;  It is also possible to validate regular expressions eg&lt;br /&gt;&lt;br /&gt;  [RegularExpression(@"^[a-zA-Z''-'\s]{1,40}$", ErrorMessage ="&amp;#8230;.")]&lt;br /&gt;&lt;br /&gt;We want to incorporate this into our view model because these attributes help to document the property and provide a mechanism to validate against. Here's another great web site that goes through the steps of adding this to a WPF application:&lt;br /&gt;&lt;br /&gt;  http://outcoldman.ru/en/blog/show/259&lt;br /&gt;&lt;br /&gt;If we run through the steps described in these websites and combine with our modified INotifyPropertyChanged base class that I described in my last blog entry we end up with a model-view that looks like:&lt;br /&gt;    &lt;/p&gt;&lt;br /&gt;        &lt;pre&gt;&lt;br /&gt;        using System.ComponentModel.DataAnnotations;  &lt;br /&gt;        using System.ComponentModel; &lt;br /&gt;        namespace Ccp.Wpf.Infrastructure.Entities&lt;br /&gt;        {&lt;br /&gt;            public class FranchiseStepPayouts : ModelSettingsBase&lt;br /&gt;            {&lt;br /&gt;                private double franchiseDeductiblePercentage;&lt;br /&gt;                [Display(Name = "Franchise deductible percentage", Description = "Blanket Franchise deductible percentage used to bla bla")]&lt;br /&gt;                [Range(0, 100, ErrorMessage = "Value for {0} must be between {1} and {2}.")]&lt;br /&gt;                public double FranchiseDeductiblePercentage&lt;br /&gt;                {&lt;br /&gt;                    get&lt;br /&gt;                    {&lt;br /&gt;                        return franchiseDeductiblePercentage;&lt;br /&gt;                    }&lt;br /&gt;                    set&lt;br /&gt;                    {&lt;br /&gt;                        Validator.ValidateProperty(value,&lt;br /&gt;                            new ValidationContext(this, null, null) { MemberName = "FranchiseDeductiblePercentage" }); &lt;br /&gt;                        franchiseDeductiblePercentage = value;&lt;br /&gt;                        RaisePropertyChanged(() =&gt; FranchiseDeductiblePercentage);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;        &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;&lt;br /&gt;  The validation happens on line&lt;br /&gt;&lt;br /&gt;  Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "FranchiseDeductiblePercentage" });&lt;br /&gt;&lt;br /&gt;  The corresponding view looks like:&lt;br /&gt; &lt;/p&gt;&lt;br /&gt; &lt;pre&gt;&lt;br /&gt;  &amp;lt;UserControl.Resources&amp;gt;&lt;br /&gt;  &amp;lt;local:EnumMatchToBooleanConverter x:Key="enumConverter" /&amp;gt;&lt;br /&gt;  &amp;lt;ControlTemplate x:Key="validationTemplate"&amp;gt;&lt;br /&gt;  &amp;lt;DockPanel&amp;gt;&lt;br /&gt;  &amp;lt;TextBlock Foreground="Red" FontSize="20"&amp;gt;*&amp;lt;/TextBlock&amp;gt;&lt;br /&gt;  &amp;lt;AdornedElementPlaceholder/&amp;gt;&lt;br /&gt;  &amp;lt;/DockPanel&amp;gt;&lt;br /&gt;  &amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;  &amp;lt;Style x:Key="textBoxInError" TargetType="{x:Type TextBox}"&amp;gt;&lt;br /&gt;  &amp;lt;Style.Triggers&amp;gt;&lt;br /&gt;  &amp;lt;Trigger Property="Validation.HasError" Value="true"&amp;gt;&lt;br /&gt;  &amp;lt;Setter Property="ToolTip"&lt;br /&gt;  Value="{Binding RelativeSource={x:Static RelativeSource.Self},&lt;br /&gt;  Path=(Validation.Errors)[0].ErrorContent}"/&amp;gt;&lt;br /&gt;  &amp;lt;/Trigger&amp;gt;&lt;br /&gt;  &amp;lt;/Style.Triggers&amp;gt;&lt;br /&gt;  &amp;lt;/Style&amp;gt;&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; &lt;p&gt;&lt;br /&gt;  ...&lt;br /&gt; &lt;/p&gt;&lt;br /&gt; &lt;pre&gt;&lt;br /&gt;  &amp;lt;!-- Franchise --&amp;gt;&lt;br /&gt;  &amp;lt;StackPanel Orientation="Horizontal" Grid.Column="1" Grid.Row="0"&amp;gt;&lt;br /&gt;  &amp;lt;TextBox Text="{Binding FranchiseDeductiblePercentage, Mode= TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}"&lt;br /&gt;  Width="100"&lt;br /&gt;  Validation.ErrorTemplate="{StaticResource validationTemplate}"&lt;br /&gt;  Style="{StaticResource textBoxInError}" /&amp;gt;&lt;br /&gt;  &amp;lt;Label Content="%" Height="23" VerticalAlignment="Top" /&amp;gt;&lt;br /&gt;  &amp;lt;/StackPanel&amp;gt;&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; &lt;p&gt;&lt;br /&gt;  Breaking this down into parts: The text box contains a binding with an a term "ValidatesOnExceptions=true" This tells the view that it should listen for Validation exceptions that are thrown in the view model. This happens in the setter with the Validator.ValidateProperty. So in our case we have decorated our FranchiseDeductiblePercentage with&lt;br /&gt;&lt;br /&gt;  [Display(Name = "Franchise deductible percentage", Description = "Blanket Franchise deductible percentage used to bla bla")]&lt;br /&gt;  [Range(0, 100, ErrorMessage = "Value for {0} must be between {1} and {2}.")]&lt;br /&gt;&lt;br /&gt;  This means that if we enter a value outside of the range 0 to 100 inclusive then an execption will be raised when we validate in the code below:&lt;br /&gt;&lt;br /&gt;  Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "FranchiseDeductiblePercentage" });&lt;br /&gt;&lt;br /&gt;  Then in the textbox we specified a validation template as follows:&lt;br /&gt;&lt;br /&gt;  Validation.ErrorTemplate="{StaticResource validationTemplate}"&lt;br /&gt;&lt;br /&gt;  The definition of this template looks like:&lt;br /&gt; &lt;/p&gt;&lt;br /&gt; &lt;pre&gt;&lt;br /&gt;  &amp;lt;ControlTemplate x:Key="validationTemplate"&amp;gt;&lt;br /&gt;  &amp;lt;DockPanel&amp;gt;&lt;br /&gt;  &amp;lt;TextBlock Foreground="Red" FontSize="20"&amp;gt;*&amp;lt;/TextBlock&amp;gt;&lt;br /&gt;  &amp;lt;AdornedElementPlaceholder/&amp;gt;&lt;br /&gt;  &amp;lt;/DockPanel&amp;gt;&lt;br /&gt;  &amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; &lt;p&gt;&lt;br /&gt;  Actually we don't need to overwrite the default validation template but it's interesting to see how this is done so that we have more control over what we are doing. But we want to get some kind of message that describes why the entered value is wrong. This is done by creating a trigger that sets a Tooltip when an error occurs. This is done as shown below:&lt;br /&gt; &lt;/p&gt;&lt;br /&gt; &lt;pre&gt;&lt;br /&gt;  &amp;lt;Style x:Key="textBoxInError" TargetType="{x:Type TextBox}"&amp;gt;&lt;br /&gt;  &amp;lt;Style.Triggers&amp;gt;&lt;br /&gt;  &amp;lt;Trigger Property="Validation.HasError" Value="true"&amp;gt;&lt;br /&gt;  &amp;lt;Setter Property="ToolTip"&lt;br /&gt;  Value="{Binding RelativeSource={x:Static RelativeSource.Self},&lt;br /&gt;  Path=(Validation.Errors)[0].ErrorContent}"/&amp;gt;&lt;br /&gt;  &amp;lt;/Trigger&amp;gt;&lt;br /&gt;  &amp;lt;/Style.Triggers&amp;gt;&lt;br /&gt;  &amp;lt;/Style&amp;gt;&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; &lt;p&gt;&lt;br /&gt;  Notice the very interesting binding path, in particular&lt;br /&gt;&lt;br /&gt;  Path=(Validation.Errors)[0].ErrorContent}&lt;br /&gt;&lt;br /&gt;If I understand this correctly the view is listening for a validation error and then is able to resolve Validation.Errors. The display and range attributes set metadata that the Validation object is able to reflect upon and incorporate in a formatted error message. In our case we have 2 attributes&lt;br /&gt;&lt;br /&gt;  [Display(Name = "Franchise deductible percentage", Description = "Blanket Franchise deductible percentage used to bla bla")]&lt;br /&gt;  [Range(0, 100, ErrorMessage = "Value for {0} must be between {1} and {2}.")]&lt;br /&gt;&lt;br /&gt;This will build a tooltip that looks like "Value for Franchise deductible percentage must be between 0 and 100."&lt;br /&gt;&lt;br /&gt;Our next step was to think about adding a glyph or information icon that contains the description of the field so that the user has a more precise description of what the field is about. This turned out to be a little tricky. You could create some property that have the decription eg:&lt;br /&gt; &lt;/p&gt;&lt;br /&gt; &lt;pre&gt;&lt;br /&gt;      public double FranchiseDeductiblePercentageDescription&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                ValidationContext x = new ValidationContext(this, null, null) { MemberName = "FranchiseDeductiblePercentage" };&lt;br /&gt;                return x.DisplayName;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;    &lt;/pre&gt;&lt;br /&gt; &lt;p&gt;&lt;br /&gt;  But this means a lot of extra typing. We found more information about the definition of the DisplayAttribute at:&lt;br /&gt; &lt;/p&gt;&lt;br /&gt; &lt;p&gt;&lt;br /&gt;  http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.displayformatattribute.aspx&lt;br /&gt;&lt;br /&gt;We decided to use reflector to disassemble the Silverlight SDK to figure out how they implemented the DisplayViewer. The assembly was located in&lt;br /&gt;&lt;br /&gt;  C:\Program Files (x86)\Microsoft SDKs\Silverlight\v4.0\Libraries\Client\System.Windows.Controls.Data.Input.dll&lt;br /&gt;&lt;br /&gt;  There was a lot of code and we managed to get quite far but decided to refine our google search criteria to include the term converter. And we found an example but I can't remember from which web site. After some adjustments the viewer looks like&lt;br /&gt; &lt;/p&gt;&lt;br /&gt; &lt;pre&gt;&lt;br /&gt;&lt;br /&gt;namespace Ccp.Wpf.Infrastructure.Converter&lt;br /&gt;{&lt;br /&gt;    [ValueConversion(typeof(String), typeof(String))]&lt;br /&gt;    public class MetaDataDisplayNameConverter : IValueConverter&lt;br /&gt;    {&lt;br /&gt;        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)&lt;br /&gt;        {&lt;br /&gt;            string result = "";&lt;br /&gt;&lt;br /&gt;            if (value != null)&lt;br /&gt;            {&lt;br /&gt;                Type sourceType = value.GetType();&lt;br /&gt;                var propertyName = parameter as string;&lt;br /&gt;                &lt;br /&gt;                if (propertyName != null)&lt;br /&gt;                {&lt;br /&gt;                    var propertyInfo = sourceType.GetProperty(propertyName);&lt;br /&gt;&lt;br /&gt;                    foreach (DisplayAttribute attr in propertyInfo.GetCustomAttributes(typeof(DisplayAttribute), true))&lt;br /&gt;                    {&lt;br /&gt;                        result = attr.Description;&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;    &lt;br /&gt;            return result;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)&lt;br /&gt;        {&lt;br /&gt;            throw new NotImplementedException();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; &lt;p&gt;&lt;br /&gt;  This converted is used in the following way:&lt;br /&gt;&lt;br /&gt;  &amp;lt;Image Source="/Ccp.Wpf.Infrastructure;Component/Images/Cute-Ball-Info-icon.png" Height="23" Stretch="Uniform" VerticalAlignment="Top"&lt;br /&gt;  ToolTip="{Binding Converter={StaticResource metaDataDisplayNameConverter}, ConverterParameter=FranchiseDeductiblePercentage}"/&amp;gt;&lt;br /&gt;&lt;br /&gt;  By not specifying a parameter in the Binding clause we pass the data context to the converter. The ConverterParameter specifies a string that we should search for when we make reflection. Reflection is a slow operation so we if we use this converter in large forms we should add a cache in the way of a static private property in the converter. This could be a Hashtable or a dictionary. Coming back to the validation mechanism. There are disadvantages to throwing exceptions in setters. These are described quite well by http://outcoldman.ru/en/blog/show/259&lt;br /&gt;&lt;br /&gt;The main problem is that exceptions should only be thrown when an unforeseen condition is met. So we want to use data annotations without throwing exceptions in the setter. It turns out that these is another binding property called&lt;br /&gt;&lt;br /&gt;  ValidatesOnDataErrors=True&lt;br /&gt;&lt;br /&gt;  When this is set the view looks for an implementation of IDataErrorInfo. So this means instead of looking for an exception we are listening to an interface. This means that our binding looks like:&lt;br /&gt; &lt;/p&gt;&lt;br /&gt; &lt;pre&gt;&lt;br /&gt;  &amp;lt;TextBox Text="{Binding FranchiseDeductiblePercentage, Mode= TwoWay, ValidatesOnDataErrors=True, NotifyOnValidationError=true}"&lt;br /&gt;  Width="100"&lt;br /&gt;  Validation.ErrorTemplate="{StaticResource validationTemplate}"&lt;br /&gt;  Style="{StaticResource textBoxInError}" /&amp;gt;&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; &lt;p&gt;&lt;br /&gt;  We found an implementation of IDataErrorInfo at&lt;br /&gt;&lt;br /&gt;  http://stackoverflow.com/questions/3739059/prism-idataerrorinfo-validation-with-dataannotation-on-viewmodel-entities&lt;br /&gt;&lt;br /&gt;  After some small modifications our implementation looked like:&lt;br /&gt; &lt;/p&gt;&lt;br /&gt; &lt;pre&gt;&lt;br /&gt;using System;&lt;br /&gt;using System.Collections.Generic;&lt;br /&gt;using System.Linq;&lt;br /&gt;using System.Text;&lt;br /&gt;using System.ComponentModel;&lt;br /&gt;using System.ComponentModel.DataAnnotations;&lt;br /&gt;using System.Reflection;&lt;br /&gt;using System.Linq.Expressions;&lt;br /&gt;&lt;br /&gt;namespace Ccp.Contracts.UI&lt;br /&gt;{&lt;br /&gt;    public class DataErrorInfo : NotificationObject, IDataErrorInfo &lt;br /&gt;    {&lt;br /&gt;        public string Error&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                return null;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        string IDataErrorInfo.this[string columnName]&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                return ValidateProperty(columnName);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        protected virtual string ValidateProperty(string columnName)&lt;br /&gt;        {&lt;br /&gt;            // get cached property accessors       &lt;br /&gt;            var propertyGetters = GetPropertyGetterLookups(GetType());&lt;br /&gt;            if (propertyGetters.ContainsKey(columnName))&lt;br /&gt;            {&lt;br /&gt;                // read value of given property         &lt;br /&gt;                var value = propertyGetters[columnName](this);&lt;br /&gt;                // run validation               &lt;br /&gt;                var results = new List&lt;ValidationResult&gt;();&lt;br /&gt;                var vc = new ValidationContext(this, null, null) { MemberName = columnName };&lt;br /&gt;                Validator.TryValidateProperty(value, vc, results);&lt;br /&gt;                // transpose results           &lt;br /&gt;                var errors = Array.ConvertAll(results.ToArray(), o =&amp;gt; o.ErrorMessage);&lt;br /&gt;                return string.Join(Environment.NewLine, errors);&lt;br /&gt;            }&lt;br /&gt;            return string.Empty;&lt;br /&gt;        }&lt;br /&gt;        private static readonly Dictionary&amp;lt;string, object&amp;gt;&lt;br /&gt;            PropertyLookupCache = new Dictionary&amp;lt;string, object&amp;gt;();&lt;br /&gt;        private static Dictionary&amp;lt;string, Func&amp;lt;object, object&amp;gt;&amp;gt; GetPropertyGetterLookups(Type objType)&lt;br /&gt;        {&lt;br /&gt;            var key = objType.FullName ?? ""; &lt;br /&gt;            if (!PropertyLookupCache.ContainsKey(key))&lt;br /&gt;            {&lt;br /&gt;                var o = objType.GetProperties().Where(p =&gt; GetValidations(p).Length != 0).ToDictionary(p =&gt; p.Name, CreatePropertyGetter);&lt;br /&gt;                PropertyLookupCache[key] = o; &lt;br /&gt;                return o;&lt;br /&gt;            } &lt;br /&gt;            return (Dictionary&amp;lt;string, Func&amp;gt;object, object&amp;gt;&amp;gt;)PropertyLookupCache[key];&lt;br /&gt;        }&lt;br /&gt;        private static Func&amp;lt;object, object&amp;gt; CreatePropertyGetter(PropertyInfo propertyInfo)&lt;br /&gt;        {&lt;br /&gt;            var instanceParameter = Expression.Parameter(typeof(object), "instance");&lt;br /&gt;            var expression = Expression.Lambda&amp;lt;Func&amp;lt;object, object&amp;gt;&amp;gt;(Expression.ConvertChecked(Expression.MakeMemberAccess(Expression.ConvertChecked(instanceParameter, propertyInfo.DeclaringType), propertyInfo), typeof(object)), instanceParameter);&lt;br /&gt;            var compiledExpression = expression.Compile(); return compiledExpression;&lt;br /&gt;        }&lt;br /&gt;        private static ValidationAttribute[] GetValidations(PropertyInfo property)&lt;br /&gt;        {&lt;br /&gt;            return (ValidationAttribute[])property.GetCustomAttributes(typeof(ValidationAttribute), true);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt; &lt;/pre&gt; &lt;p&gt;&lt;br /&gt;  Notice that we inherit from our Notification object, this is so that we can use a func instead of a string to identify which property has changed. Then all we need to do to inherit from this base class in our view model. In our case we have an intermediate base class because we are implementing a MVVMC&lt;br /&gt; &lt;/p&gt;&lt;br /&gt; &lt;pre&gt;&lt;br /&gt;namespace Ccp.Contracts.Model&lt;br /&gt;{&lt;br /&gt;    /// &lt;summary&gt;&lt;br /&gt;    /// This classes could be generated from a T4 template (pocos)&lt;br /&gt;    /// &lt;/summary&gt;&lt;br /&gt;    public abstract class ModelSettingsBase : DataErrorInfo&lt;br /&gt;    {&lt;br /&gt;        /// &lt;summary&gt;&lt;br /&gt;        /// Just an example of a field&lt;br /&gt;        /// &lt;/summary&gt;&lt;br /&gt;        public string Name&lt;br /&gt;        {&lt;br /&gt;            get { return this.GetType().Name; }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public abstract void Save(int ModelRunId);&lt;br /&gt;        public abstract bool Validate();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; &lt;p&gt;&lt;br /&gt;  Then&lt;br /&gt; &lt;/p&gt;&lt;br /&gt; &lt;pre&gt;&lt;br /&gt;namespace Ccp.Wpf.Infrastructure.Entities&lt;br /&gt;{&lt;br /&gt;    public class FranchiseStepPayouts : ModelSettingsBase&lt;br /&gt;    {&lt;br /&gt;        private double franchiseDeductiblePercentage;&lt;br /&gt;        [Display(Name = "Franchise deductible percentage", Description = "Blanket Franchize deductible percentage")]&lt;br /&gt;        [Range(0, 100, ErrorMessage = "Value for {0} must be between {1} and {2}.")]&lt;br /&gt;        public double FranchiseDeductiblePercentage&lt;br /&gt;        {&lt;br /&gt;            get&lt;br /&gt;            {&lt;br /&gt;                return franchiseDeductiblePercentage;&lt;br /&gt;            }&lt;br /&gt;            set&lt;br /&gt;            {&lt;br /&gt;                //Validator.ValidateProperty(value,  new ValidationContext(this, null, null) { MemberName = "FranchiseDeductiblePercentage" });&lt;br /&gt; &lt;br /&gt;                franchiseDeductiblePercentage = value;&lt;br /&gt;                RaisePropertyChanged(() =&gt; FranchiseDeductiblePercentage);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt; &lt;/pre&gt;&lt;br /&gt; &lt;p&gt;&lt;br /&gt;  And now it works without exceptions&lt;br /&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-6560493852437869566?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/6560493852437869566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/6560493852437869566'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2011/03/paired-programming-how-to-use-data.html' title='Paired programming: How to use Data Annotations in WPF without throwing Validation exceptions'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-6504344620790126788</id><published>2011-03-04T12:05:00.001-08:00</published><updated>2011-03-04T12:05:17.636-08:00</updated><title type='text'>A day of WPF paired programming</title><content type='html'>&lt;p&gt;Here’s a journal of code that was written in a paired programming session last week…&lt;/p&gt;  &lt;p&gt;We started by looking at the FranchiseStepPayoutFunction Control. This control has some interesting behavior. Part of the control consists of a table of LowerLimit,UpperLimit and Payout. We would like that the Upper Limit of Row n populates the lower limit of Row n+1. We would also like to style the grid with characters like &amp;quot;-&amp;quot; between the upper and lower limit and a % for the payout. &lt;/p&gt;  &lt;p&gt;Starting with the xaml, we decided to use a ItemControl to solve this: &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ItemsControl ItemsSource=&amp;quot;{Binding StepPayouts}&amp;quot; Grid.Row=&amp;quot;2&amp;quot; Grid.Column=&amp;quot;1&amp;quot; Grid.ColumnSpan=&amp;quot;4&amp;quot;&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ItemsControl.ItemsPanel&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ItemsPanelTemplate&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;StackPanel Orientation=&amp;quot;Vertical&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/ItemsPanelTemplate&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/ItemsControl.ItemsPanel&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ItemsControl.ItemTemplate&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;DataTemplate&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;StackPanel Orientation=&amp;quot;Horizontal&amp;quot; HorizontalAlignment=&amp;quot;Left&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;TextBox Text=&amp;quot;{Binding LowerStepLimit, Mode= TwoWay}&amp;quot; Width=&amp;quot;100&amp;quot; Margin=&amp;quot;0 0 10 0&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Label Content=&amp;quot;-&amp;quot; Height=&amp;quot;23&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;TextBox Text=&amp;quot;{Binding UpperStepLimit, Mode= TwoWay}&amp;quot; Width=&amp;quot;100&amp;quot; Margin=&amp;quot;0 0 10 0&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;TextBox Text=&amp;quot;{Binding Payout, Mode= TwoWay}&amp;quot; Width=&amp;quot;100&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Label Content=&amp;quot;%&amp;quot; Height=&amp;quot;23&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/StackPanel&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/DataTemplate&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/ItemsControl.ItemTemplate&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/ItemsControl&amp;gt; &lt;/p&gt;  &lt;p&gt;This is bound to a List &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public class FranchiseStepPayouts : ModelSettingsBase   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public List&amp;lt;StepPayout&amp;gt; StepPayouts { get; private set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public FranchiseStepPayouts()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; StepPayouts = new List&amp;lt;StepPayout&amp;gt;(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Populate 4 columns   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (int i = 0; i &amp;lt; 4; i++)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; StepPayout s = new StepPayout(0, 0, 0);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; s.UpperStepLimitChangedEvent += new StepPayout.UpperStepLimitChangedHandler(s_UpperStepLimitChangedEvent);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; StepPayouts.Add(s);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;...   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;The StepPayout looks like: &lt;/p&gt;  &lt;p&gt;namespace Ccp.Wpf.Infrastructure.Entities   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class StepPayout : NotificationObject     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public delegate void PayoutChangedHandler(object sender);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public event PayoutChangedHandler PayoutChangedEvent;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; virtual protected void PayoutChangedRaiseEvent()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (PayoutChangedEvent != null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PayoutChangedEvent(this);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private double payout;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public double Payout     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return this.payout;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; payout = value;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RaisePropertyChanged(()=&amp;gt;Payout);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PayoutChangedRaiseEvent();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .. dito for Lower and Upper Step Payout limits &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public StepPayout(double UpperStepLimit, double LowerStepLimit, double Payout)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.lowerStepLimit = LowerStepLimit;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.upperStepLimit = UpperStepLimit;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.payout = Payout;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;Notice that we used a home made NotificationObject, this is so that we don't need to write a string in the RaisePropertyChanged field. Which means, instead of writing   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RaisePropertyChanged(&amp;quot;Payout&amp;quot;);    &lt;br /&gt;we can write    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RaisePropertyChanged(()=&amp;gt;Payout); &lt;/p&gt;  &lt;p&gt;We copied the code that makes this possible from Prism. Our home made class for this looks like: &lt;/p&gt;  &lt;p&gt;namespace Ccp.Wpf.Infrastructure.Helpers   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class NotificationObject : INotifyPropertyChanged    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public event PropertyChangedEventHandler PropertyChanged; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; protected virtual void RaisePropertyChanged(string propertyName)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (PropertyChanged != null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PropertyChanged(this, new PropertyChangedEventArgs(propertyName));    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; protected void RaisePropertyChanged&amp;lt;T&amp;gt;(Expression&amp;lt;Func&amp;lt;T&amp;gt;&amp;gt; propertyExpression)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var propertyName = ExtractPropertyName(propertyExpression);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.RaisePropertyChanged(propertyName);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public static string ExtractPropertyName&amp;lt;T&amp;gt;(Expression&amp;lt;Func&amp;lt;T&amp;gt;&amp;gt; propertyExpression)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (propertyExpression == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new ArgumentNullException(&amp;quot;propertyExpression&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var memberExpression = propertyExpression.Body as MemberExpression;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (memberExpression == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new ArgumentException(&amp;quot;NotMemberAccessExpression_Exception&amp;quot;, &amp;quot;propertyExpression&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var property = memberExpression.Member as PropertyInfo;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (property == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new ArgumentException(&amp;quot;ExpressionNotProperty_Exception&amp;quot;, &amp;quot;propertyExpression&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var getMethod = property.GetGetMethod(true);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (getMethod.IsStatic)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new ArgumentException(&amp;quot;StaticExpression_Exception&amp;quot;, &amp;quot;propertyExpression&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return memberExpression.Member.Name;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;Our application does not need to be localizable so we removed the references to resources. &lt;/p&gt;  &lt;p&gt;The next thing that we looked at was the list that we used in the view model &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public class FranchiseStepPayouts : ModelSettingsBase   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public List&amp;lt;StepPayout&amp;gt; StepPayouts { get; private set; } &lt;/p&gt;  &lt;p&gt;This works well provided the number of items in the list does not change. If the number of items in the list changes you need to replace List with ObservableCollection and you need to RaisePropertyChanged so that the UI know it needs to update. If the list was very large this would lead to an avalanche of events that would make the UI unresponsive, in that case it is better to create the observable list and set the entire property in one go. In our case we only have a few items. This makes the code look like the following. &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public class FranchiseStepPayouts : ModelSettingsBase   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private ObservableCollection&amp;lt;StepPayout&amp;gt; stepPayouts;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public ObservableCollection&amp;lt;StepPayout&amp;gt; StepPayouts    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return stepPayouts;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private set    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; stepPayouts = value;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RaisePropertyChanged(() =&amp;gt; StepPayouts);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private PayOutFunction payoutFunction; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public PayOutFunction PayoutFunction   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return payoutFunction;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; payoutFunction = value;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RaisePropertyChanged(() =&amp;gt; PayoutFunction);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;We register the events in the constructor &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public FranchiseStepPayouts()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; StepPayouts = new ObservableCollection&amp;lt;StepPayout&amp;gt;(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Populate 4 columns   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (int i = 0; i &amp;lt; 4; i++)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; StepPayout s = new StepPayout(0, 0, 0);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; s.UpperStepLimitChangedEvent += new StepPayout.UpperStepLimitChangedHandler(s_UpperStepLimitChangedEvent);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; StepPayouts.Add(s);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;We respond to the events by replacing the lower limit of the n+1 column   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; void s_UpperStepLimitChangedEvent(object sender)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (int i = 0; i &amp;lt; this.StepPayouts.Count - 1; i++)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.StepPayouts[i + 1].LowerStepLimit = this.StepPayouts[i].UpperStepLimit;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;Next adding an auto hide function with checkbox &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public class FranchiseStepPayouts : ModelSettingsBase   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private bool isPayoutFunctionVisible; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public bool IsPayoutFunctionVisible   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return isPayoutFunctionVisible;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; isPayoutFunctionVisible = value;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RaisePropertyChanged(() =&amp;gt; IsPayoutFunctionVisible);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;lt;UserControl x:Class=&amp;quot;Ccp.Wpf.Infrastructure.Controls.FranchiseStepPayoutsView&amp;quot;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns=&amp;quot;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:x=&amp;quot;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;"&gt;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:mc=&amp;quot;&lt;a href="http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot;"&gt;http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:d=&amp;quot;&lt;a href="http://schemas.microsoft.com/expression/blend/2008&amp;quot;"&gt;http://schemas.microsoft.com/expression/blend/2008&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:local=&amp;quot;clr-namespace:Ccp.Wpf.Infrastructure.Controls&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:converter=&amp;quot;clr-namespace:Ccp.Wpf.Infrastructure.Converter&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mc:Ignorable=&amp;quot;d&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; d:DesignWidth=&amp;quot;500&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;UserControl.Resources&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;local:EnumMatchToBooleanConverter x:Key=&amp;quot;enumConverter&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/UserControl.Resources&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;StackPanel Orientation=&amp;quot;Vertical&amp;quot; Grid.Column=&amp;quot;0&amp;quot; VerticalAlignment=&amp;quot;Stretch&amp;quot; HorizontalAlignment=&amp;quot;Stretch&amp;quot;&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;CheckBox Content=&amp;quot;Japanise Payout Function&amp;quot; IsChecked=&amp;quot;{Binding IsPayoutFunctionVisible}&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;GroupBox Header=&amp;quot;Japanise Payout Function&amp;quot; Visibility=&amp;quot;{Binding IsPayoutFunctionVisible, Converter={converter:BoolToVisibilityConverter FalseValue=Collapsed}}&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot; HorizontalAlignment=&amp;quot;Left&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Grid&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- Content --&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Grid&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/GroupBox&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/StackPanel&amp;gt;    &lt;br /&gt;&amp;lt;/UserControl&amp;gt; &lt;/p&gt;  &lt;p&gt;namespace Ccp.Wpf.Infrastructure.Converter   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class BoolToVisibilityConverter : MarkupExtension, IValueConverter    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public BoolToVisibilityConverter()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TrueValue = Visibility.Visible;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FalseValue = Visibility.Collapsed;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public Visibility TrueValue { get; set; }   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public Visibility FalseValue { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; bool val = System.Convert.ToBoolean(value);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return val ? TrueValue : FalseValue;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return TrueValue.Equals(value) ? true : false;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override object ProvideValue(IServiceProvider serviceProvider)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return this;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;Next here is the implementation of a radio button &lt;/p&gt;  &lt;p&gt;&amp;lt;UserControl x:Class=&amp;quot;Ccp.Wpf.Infrastructure.Controls.FranchiseStepPayoutsView&amp;quot;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns=&amp;quot;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:x=&amp;quot;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;"&gt;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:mc=&amp;quot;&lt;a href="http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot;"&gt;http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:d=&amp;quot;&lt;a href="http://schemas.microsoft.com/expression/blend/2008&amp;quot;"&gt;http://schemas.microsoft.com/expression/blend/2008&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:local=&amp;quot;clr-namespace:Ccp.Wpf.Infrastructure.Controls&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:converter=&amp;quot;clr-namespace:Ccp.Wpf.Infrastructure.Converter&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mc:Ignorable=&amp;quot;d&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; d:DesignWidth=&amp;quot;500&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;UserControl.Resources&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;local:EnumMatchToBooleanConverter x:Key=&amp;quot;enumConverter&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/UserControl.Resources&amp;gt;    &lt;br /&gt;... &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;StackPanel Orientation=&amp;quot;Vertical&amp;quot;&amp;#160; HorizontalAlignment=&amp;quot;Left&amp;quot;&amp;#160; Grid.Row=&amp;quot;0&amp;quot; Grid.RowSpan=&amp;quot;2&amp;quot; Grid.Column=&amp;quot;0&amp;quot; Width=&amp;quot;100&amp;quot;&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;StackPanel Orientation=&amp;quot;Horizontal&amp;quot;&amp;#160; HorizontalAlignment=&amp;quot;Left&amp;quot;&amp;#160; &amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;RadioButton Content=&amp;quot;Franchise&amp;quot; GroupName=&amp;quot;Franchise&amp;quot; Height=&amp;quot;23&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IsChecked=&amp;quot;{Binding Path=PayoutFunction, Mode=TwoWay,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Converter={StaticResource enumConverter},    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ConverterParameter=Franchise}&amp;quot;&amp;#160; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Label Content=&amp;quot; &amp;quot; Height=&amp;quot;23&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/StackPanel&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;StackPanel Orientation=&amp;quot;Horizontal&amp;quot;&amp;#160; HorizontalAlignment=&amp;quot;Left&amp;quot;&amp;#160; &amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;RadioButton Content=&amp;quot;Step Payout&amp;quot; GroupName=&amp;quot;Franchise&amp;quot; Height=&amp;quot;23&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IsChecked=&amp;quot;{Binding Path=PayoutFunction, Mode=TwoWay,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Converter={StaticResource enumConverter},    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ConverterParameter=StepPayout}&amp;quot;&amp;#160; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Label Content=&amp;quot; &amp;quot; Height=&amp;quot;23&amp;quot; VerticalAlignment=&amp;quot;Top&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/StackPanel&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/StackPanel&amp;gt;    &lt;br /&gt;... &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Grid&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/GroupBox&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/StackPanel&amp;gt;    &lt;br /&gt;&amp;lt;/UserControl&amp;gt; &lt;/p&gt;  &lt;p&gt;namespace Ccp.Wpf.Infrastructure.Controls   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class EnumMatchToBooleanConverter : IValueConverter    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public object Convert(object value, Type targetType,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; object parameter, CultureInfo culture)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (value == null || parameter == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return false; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string checkValue = value.ToString();   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string targetValue = parameter.ToString();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return checkValue.Equals(targetValue,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; StringComparison.InvariantCultureIgnoreCase);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public object ConvertBack(object value, Type targetType,   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; object parameter, CultureInfo culture)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (value == null || parameter == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return null; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; bool useValue = (bool)value;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string targetValue = parameter.ToString();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (useValue)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return Enum.Parse(targetType, targetValue); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return null;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;namespace Ccp.Wpf.Infrastructure.Entities   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public enum PayOutFunction    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; None,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Franchise,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; StepPayout    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;namespace Ccp.Wpf.Infrastructure.Entities   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class FranchiseStepPayouts : ModelSettingsBase    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private PayOutFunction payoutFunction; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public PayOutFunction PayoutFunction   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return payoutFunction;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; payoutFunction = value;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RaisePropertyChanged(() =&amp;gt; PayoutFunction);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;Next here is how to call the wpf windows with a foriegn key (ExposureDataId) &lt;/p&gt;  &lt;p&gt;Use the container to access the modelview of the WPF user control &lt;/p&gt;  &lt;p&gt;Public Class frmCatFocusMain   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Implements IDisposable    &lt;br /&gt;..    &lt;br /&gt;&amp;#160;&amp;#160; Private _container As CompositionContainer    &lt;br /&gt;..    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Public Sub New() &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 'Dim directoryCatalog As New DirectoryCatalog(&amp;quot;.&amp;quot;)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dim iAggregateCatalog As New AggregateCatalog() &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; iAggregateCatalog.Catalogs.Add(New AssemblyCatalog(Assembly.GetExecutingAssembly()))   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; iAggregateCatalog.Catalogs.Add(New AssemblyCatalog(GetType(ViewFactory).Assembly))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; iAggregateCatalog.Catalogs.Add(New AssemblyCatalog(GetType(ModelSettingsService).Assembly))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; iAggregateCatalog.Catalogs.Add(New AssemblyCatalog(GetType(ModelSettingsForEarthquakeAfricaIndia).Assembly))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 'iAggregateCatalog.Catalogs.Add(New AssemblyCatalog(GetType(CommonModelSettingsView).Assembly)) &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dim batch As New CompositionBatch()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; batch.AddPart(Me)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _container = New CompositionContainer(iAggregateCatalog) &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ViewFactory = New ViewFactory(_container)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _container.ComposeExportedValue(Of ViewFactory)(ViewFactory)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _container.ComposeParts(ViewFactory)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _container.Compose(batch)    &lt;br /&gt;...    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InitializeComponent()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End Sub    &lt;br /&gt;...    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Private Sub BtnNewRunModelWizard_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnNewRunModelWizard.Click    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dim ExposureDataId As Integer = 12123    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dim iWindow As Windows.Window = ViewFactory.CreateWindow(Of ModelSettingsView)()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dim viewModel As ModelSettingsViewModel = _container.GetExportedValueOrDefault(Of ModelSettingsViewModel)()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; viewModel.ExposureDataId = ExposureDataId    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; iWindow.ShowDialog()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; End Sub &lt;/p&gt;  &lt;p&gt;namespace Ccp.UI.ModelResults.Views.ModelSettings   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [Export(typeof(ModelSettingsViewModel))]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //[PartCreationPolicy(CreationPolicy.NonShared)]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class ModelSettingsViewModel : ViewModelBase    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private int exposureDataId;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public int ExposureDataId    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return exposureDataId;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; exposureDataId = value;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RaisePropertyChanged(&amp;quot;ExposureDataId&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;Next we populate the comboboxs by joining some tables using our POCO EF DAL with Linq then creating an observablecollection from the result &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var result = from av in this.databaseContext.GetAll&amp;lt;CatModel&amp;gt;()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Where(z =&amp;gt; z.PerilId.Value.Equals(selectedModelPeril.PERIL_ID))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Where(z =&amp;gt; ListOfImportedCatModels.Contains(z.Id))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; join vf in this.databaseContext.GetAll&amp;lt;ModelRegion&amp;gt;()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; on av.RegionId equals vf.RegionId    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select vf; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ModelRegions = new ObservableCollection&amp;lt;ModelRegion&amp;gt;(result); &lt;/p&gt;  &lt;p&gt;Here's how joining the Lazy loaded collection of controls (via MEF) with meta data containing an enumeration that has a foriegn key to the corresponding model in our database. This is done within a setter…. &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; selectedModelRegion = value;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CatModel Selected = databaseContext    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Query&amp;lt;CatModel&amp;gt;()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Where(p =&amp;gt; p.RegionId == selectedModelRegion.RegionId)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Where(p =&amp;gt; p.PerilId == selectedModelPeril.PERIL_ID)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .FirstOrDefault&amp;lt;CatModel&amp;gt;(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var result = (from av in this.ModelSettings   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Where(z =&amp;gt; (int)z.Metadata.ModelType == Selected.Id)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select av).FirstOrDefault(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SelectedModelSetting = result; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RaisePropertyChanged(&amp;quot;SelectedModelRegion&amp;quot;); &lt;/p&gt;  &lt;p&gt;Finally here is how we persist data &lt;/p&gt;  &lt;p&gt;namespace Ccp.Contracts.Model   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public abstract class ModelSettingsBase : NotificationObject    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string Name    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return this.GetType().Name; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public abstract void Save(int ModelRunId);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public abstract bool Validate();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;namespace Ccp.UI.ModelResults.Views.ModelSettings   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [Export(typeof(ModelSettingsViewModel))]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //[PartCreationPolicy(CreationPolicy.NonShared)]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class ModelSettingsViewModel : ViewModelBase    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public RelayCommand&amp;lt;ModelSettingsBase&amp;gt; SaveModelSettingsCommand    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (saveModelSettingsCommand == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; saveModelSettingsCommand = new RelayCommand&amp;lt;ModelSettingsBase&amp;gt;((ms) =&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Save    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int ModelRunId = 123; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ms.Save(ModelRunId);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; , (ms) =&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // CanSave    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return ms != null &amp;amp;&amp;amp; ms.Validate();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return saveModelSettingsCommand;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;namespace Ccp.Wpf.Infrastructure.Entities   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [CatModelExport(ModelType.EarthquakeAfricaIndia, typeof(ModelSettingsBase))]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class ModelSettingsForEarthquakeAfricaIndia : ModelSettingsBase    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public CreditDeductible CreditDeductible { get; set; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public ZonalDeductibleByLOB ZonalDeductible3 { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public ModelSettingsForEarthquakeAfricaIndia()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CreditDeductible = new CreditDeductible();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ZonalDeductible3 = new ZonalDeductibleByLOB();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Dummy implementation    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void Save(int ModelRunId)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CreditDeductible.Save(ModelRunId);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ZonalDeductible3.Save(ModelRunId);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override bool Validate()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return CreditDeductible.Validate() &amp;amp;&amp;amp; ZonalDeductible3.Validate();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;namespace Ccp.Wpf.Infrastructure.Entities   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class CreditDeductible : ModelSettingsBase    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public double Limit { get; set; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public double Deductible { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void Save(int ModelRunId)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Update database here    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-6504344620790126788?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/6504344620790126788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/6504344620790126788'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2011/03/day-of-wpf-paired-programming.html' title='A day of WPF paired programming'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-8380440949780330872</id><published>2011-02-14T22:08:00.001-08:00</published><updated>2011-02-14T22:08:12.988-08:00</updated><title type='text'>Swapping WPF controls using MVVMC aka MVVM+Controller</title><content type='html'>&lt;p&gt;We have an application that uses WPF User Controls that we would like to dynamically change using a combobox within a pluggable architecture. The solution is based on MVVMC sometimes called MVVM+Controller.   &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;We did this by using a SpecificViewContentProvider which as the name suggests provides a view model for a ContentPresenter that has been bound to a view model with a user control as an observable property. In our case the application is very specific therefore we did not mind coupling the View coupled to the controller. If we wanted to break this dependency we would need to use MVVMLite or Prism. Again in this case this would be an overkill, therefore we decided to leave this dependency.&amp;#160; &lt;/p&gt;  &lt;p&gt;We where thinking of using MVVMLite in this application and there are some traces left, for this example it is not necessary. But frameworks like Prism and MVVMLite are very useful in simplifying applications that have complex controls. The idea is that the controls produce relay events that broadcast to anyone who is interested in there status. For example a complex tree view to complex controls to view different aspects of the application&lt;/p&gt;  &lt;p&gt;We looked at how Research would like to build the individual controls. For reasons described in day 3 we cannot inherit xaml code, therefore if we wanted to have a base control we would have to only use code behind. In windows forms this was possible with visual inheritance. Since this is not possible within xaml the visual befit of inheritance is lost. Therefore we decided to take a different approach: &lt;/p&gt;  &lt;p&gt;Most models different sets of controls. We decided a better approach would be to setup some custom controls like CreditDecductible, ZonalDeductibles etc and compose these within the control that is to be exported into the RunModelWizard. &lt;/p&gt;  &lt;p&gt;Here is how we achieved this: &lt;/p&gt;  &lt;p&gt;1. We create a user control within ArchitectureExample.PresentationLayer.WPF.Common   &lt;br /&gt;We make some binding eg {Binding Deductible, Mode= TwoWay} &lt;/p&gt;  &lt;p&gt;&amp;lt;UserControl x:Class=&amp;quot;ArchitectureExample.PresentationLayer.WPF.Common.Controls.CreditDeductibleView&amp;quot;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns=&amp;quot;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:x=&amp;quot;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;"&gt;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:mc=&amp;quot;&lt;a href="http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot;"&gt;http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:d=&amp;quot;&lt;a href="http://schemas.microsoft.com/expression/blend/2008&amp;quot;"&gt;http://schemas.microsoft.com/expression/blend/2008&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mc:Ignorable=&amp;quot;d&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; d:DesignWidth=&amp;quot;300&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Grid&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Grid.ColumnDefinitions&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ColumnDefinition Width=&amp;quot;Auto&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ColumnDefinition Width=&amp;quot;*&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Grid.ColumnDefinitions&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Grid.RowDefinitions&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;RowDefinition Height=&amp;quot;Auto&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;RowDefinition Height=&amp;quot;Auto&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Grid.RowDefinitions&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Label Content=&amp;quot;Deductible :&amp;quot; Grid.Column=&amp;quot;0&amp;quot; Grid.Row=&amp;quot;0&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;TextBox Text=&amp;quot;{Binding Deductible, Mode= TwoWay}&amp;quot; Grid.Column=&amp;quot;1&amp;quot; Grid.Row=&amp;quot;0&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Label Content=&amp;quot;Limit :&amp;quot; Grid.Column=&amp;quot;0&amp;quot; Grid.Row=&amp;quot;1&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;TextBox Text=&amp;quot;{Binding Limit, Mode= TwoWay}&amp;quot; Grid.Column=&amp;quot;1&amp;quot; Grid.Row=&amp;quot;1&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Grid&amp;gt;    &lt;br /&gt;&amp;lt;/UserControl&amp;gt; &lt;/p&gt;  &lt;p&gt;We don't make separate ModelViews because this would be an overkill &lt;/p&gt;  &lt;p&gt;2. Next we make our first injectable control ModelSettingsForEarthquakeAlaskaView.xaml within the Views/ModelSettings directory of ArchitectureExample.PresentationLayer.WPF.Client   &lt;br /&gt;The interesting line is     &lt;br /&gt;&amp;#160;&amp;#160; &amp;lt;my:CreditDeductibleView Name=&amp;quot;creditDeductibleView1&amp;quot; DataContext=&amp;quot;{Binding CreditDeductible}&amp;quot; /&amp;gt; &lt;/p&gt;  &lt;p&gt;We bind the ScreditDeductible view to CreditDeducble &lt;/p&gt;  &lt;p&gt;&amp;lt;UserControl x:Class=&amp;quot;ArchitectureExample.PresentationLayer.WPF.Client.Views.ModelSettings.ModelSettingsForEarthquakeAlaskaView&amp;quot;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns=&amp;quot;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:x=&amp;quot;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;"&gt;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:mc=&amp;quot;&lt;a href="http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot;"&gt;http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:d=&amp;quot;&lt;a href="http://schemas.microsoft.com/expression/blend/2008&amp;quot;"&gt;http://schemas.microsoft.com/expression/blend/2008&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mc:Ignorable=&amp;quot;d&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; d:DesignHeight=&amp;quot;300&amp;quot; d:DesignWidth=&amp;quot;300&amp;quot; xmlns:my=&amp;quot;clr-namespace:ArchitectureExample.PresentationLayer.WPF.Common.Controls;assembly=ArchitectureExample.PresentationLayer.WPF.Common&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;StackPanel&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;my:CreditDeductibleView Name=&amp;quot;creditDeductibleView1&amp;quot; DataContext=&amp;quot;{Binding CreditDeductible}&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/StackPanel&amp;gt;    &lt;br /&gt;&amp;lt;/UserControl&amp;gt; &lt;/p&gt;  &lt;p&gt;3. In the code behind we this export this. In this way we make this available to the combo box via MEF as a dependency injection container &lt;/p&gt;  &lt;p&gt;using System.ComponentModel.Composition;   &lt;br /&gt;using System.Windows.Controls;    &lt;br /&gt;using ArchitectureExample.BusinessLayer.Entities; &lt;/p&gt;  &lt;p&gt;namespace ArchitectureExample.PresentationLayer.WPF.Client.Views.ModelSettings   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// Interaction logic for ModelSettingsForModel2Control.xaml    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [CatModelExport(ModelType.EarthquakeAlaska, typeof(IModelSettingView))]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public partial class ModelSettingsForEarthquakeAlaskaView : UserControl, IModelSettingView    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public ModelSettingsForEarthquakeAlaskaView()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InitializeComponent();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;4. The CatModelExport attribute is defined as: &lt;/p&gt;  &lt;p&gt;namespace ArchitectureExample.BusinessLayer.Entities   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [MetadataAttribute]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class CatModelExportAttribute : ExportAttribute    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public CatModelExportAttribute(ModelType modelType, Type type)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : base(type)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.ModelType = modelType;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public ModelType ModelType { get; private set; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;(Here we had some problems in getting MEF to work because originally we used (Type type, ModelType modelType) resulting in nothing being exported into the container. &lt;/p&gt;  &lt;p&gt;5. The ModelType is also defined in this assembly as   &lt;br /&gt;namespace ArchitectureExample.BusinessLayer.Entities    &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public enum ModelType    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; None = 0,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ...    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EarthquakeAlaska = 6,    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ...    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;6. This is imported in ModelSettingsView &lt;/p&gt;  &lt;p&gt;The interesting lines are the binding that is made to the SelectedModelSetting   &lt;br /&gt;&amp;lt;ContentPresenter x:Name=&amp;quot;SpecificModelSetting&amp;quot; DataContext=&amp;quot;{Binding SelectedModelSetting}&amp;quot; Grid.Row=&amp;quot;1&amp;quot; Grid.Column=&amp;quot;0&amp;quot; Grid.ColumnSpan=&amp;quot;2&amp;quot;/&amp;gt; &lt;/p&gt;  &lt;p&gt;This is set with the combobox control   &lt;br /&gt;&amp;lt;ComboBox x:Name=&amp;quot;cmbModel&amp;quot; Grid.Column=&amp;quot;1&amp;quot; Grid.Row=&amp;quot;0&amp;quot; ItemsSource=&amp;quot;{Binding ModelSettings}&amp;quot; SelectedItem=&amp;quot;{Binding SelectedModelSetting, Mode=TwoWay}&amp;quot; DisplayMemberPath=&amp;quot;Value.Name&amp;quot;/&amp;gt; &lt;/p&gt;  &lt;p&gt;The OK button is bound to the Command SaveModelSettingsCommand. By the way, if we where programming in Silverlight we would need MVVMLite or Prism to do this because Silverlight does not support ICommand. Actually the code needed is quite small so you could role your own, but the easiest way is to take a widely used third party library like MVVMLight   &lt;br /&gt;&amp;lt;Button x:Name=&amp;quot;btnOk&amp;quot; Content=&amp;quot;OK&amp;quot; Margin=&amp;quot;0 0 5 0&amp;quot; Command=&amp;quot;{Binding SaveModelSettingsCommand}&amp;quot; CommandParameter=&amp;quot;{Binding SelectedModelSetting.Value}&amp;quot;/&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;lt;UserControl x:Class=&amp;quot;ArchitectureExample.PresentationLayer.WPF.Client.Views.ModelSettings.ModelSettingsView&amp;quot;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns=&amp;quot;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:x=&amp;quot;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;"&gt;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:mc=&amp;quot;&lt;a href="http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot;"&gt;http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlns:d=&amp;quot;&lt;a href="http://schemas.microsoft.com/expression/blend/2008&amp;quot;"&gt;http://schemas.microsoft.com/expression/blend/2008&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; mc:Ignorable=&amp;quot;d&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; d:DesignHeight=&amp;quot;300&amp;quot; d:DesignWidth=&amp;quot;300&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Grid&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Grid.ColumnDefinitions&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ColumnDefinition Width=&amp;quot;Auto&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ColumnDefinition Width=&amp;quot;*&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Grid.ColumnDefinitions&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Grid.RowDefinitions&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;RowDefinition Height=&amp;quot;Auto&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;RowDefinition Height=&amp;quot;*&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;RowDefinition Height=&amp;quot;Auto&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Grid.RowDefinitions&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Label Content=&amp;quot;Model&amp;quot; Grid.Column=&amp;quot;0&amp;quot; Grid.Row=&amp;quot;0&amp;quot;/&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ComboBox x:Name=&amp;quot;cmbModel&amp;quot; Grid.Column=&amp;quot;1&amp;quot; Grid.Row=&amp;quot;0&amp;quot; ItemsSource=&amp;quot;{Binding ModelSettings}&amp;quot; SelectedItem=&amp;quot;{Binding SelectedModelSetting, Mode=TwoWay}&amp;quot; DisplayMemberPath=&amp;quot;Value.Name&amp;quot;/&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;ContentPresenter x:Name=&amp;quot;SpecificModelSetting&amp;quot; DataContext=&amp;quot;{Binding SelectedModelSetting}&amp;quot; Grid.Row=&amp;quot;1&amp;quot; Grid.Column=&amp;quot;0&amp;quot; Grid.ColumnSpan=&amp;quot;2&amp;quot;/&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;StackPanel Orientation=&amp;quot;Horizontal&amp;quot; Grid.Column=&amp;quot;1&amp;quot; Grid.Row=&amp;quot;2&amp;quot; HorizontalAlignment=&amp;quot;Right&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Button x:Name=&amp;quot;btnOk&amp;quot; Content=&amp;quot;OK&amp;quot; Margin=&amp;quot;0 0 5 0&amp;quot; Command=&amp;quot;{Binding SaveModelSettingsCommand}&amp;quot; CommandParameter=&amp;quot;{Binding SelectedModelSetting.Value}&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;Button x:Name=&amp;quot;btnCancel&amp;quot; Content=&amp;quot;Cancel&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/StackPanel&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/Grid&amp;gt;    &lt;br /&gt;&amp;lt;/UserControl&amp;gt; &lt;/p&gt;  &lt;p&gt;7. The code behind this imports the ViewFactory &lt;/p&gt;  &lt;p&gt;namespace ArchitectureExample.PresentationLayer.WPF.Client.Views.ModelSettings   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [Export(typeof(ModelSettingsView))]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [PartCreationPolicy(CreationPolicy.NonShared)]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public partial class ModelSettingsView : UserControl    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private ModelSettingsController controller; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Import(typeof(ViewFactory))]   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public ViewFactory ViewFactory { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [Import]   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [SuppressMessage(&amp;quot;Microsoft.Design&amp;quot;, &amp;quot;CA1044:PropertiesShouldNotBeWriteOnly&amp;quot;, Justification = &amp;quot;Needs to be a property to be composed by MEF&amp;quot;)]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public ModelSettingsViewModel ViewModel    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (this.DataContext != value)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.DataContext = value;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; controller = new ModelSettingsController(ViewFactory, value, this);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public ModelSettingsView()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InitializeComponent();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;8. The View Factory contains and enumerable of Lazy&amp;lt;IModelSettingView, IModelSettingMetadata&amp;gt; &lt;/p&gt;  &lt;p&gt;namespace ArchitectureExample.PresentationLayer.WPF.Client.Infrastructure   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class ViewFactory    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [ImportMany(typeof(IModelSettingView))]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public IEnumerable&amp;lt;Lazy&amp;lt;IModelSettingView, IModelSettingMetadata&amp;gt;&amp;gt; ModuleSettingsViews { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private readonly CompositionContainer container; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public ViewFactory(CompositionContainer container)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.container = container;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public T GetView&amp;lt;T&amp;gt;(string viewName)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var view = this.container.GetExportedValueOrDefault&amp;lt;T&amp;gt;(viewName);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (view == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new InvalidOperationException(string.Format(&amp;quot;Unable to locate view with name {0}.&amp;quot;, viewName));    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return view;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public IModelSettingView GetView(ModelType modelType)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //var view = this.container.GetExportedValues&amp;lt;Lazy&amp;lt;T, TMetaData&amp;gt;&amp;gt;().Where&amp;lt;Lazy&amp;lt;T, TMetaData&amp;gt;&amp;gt;(a =&amp;gt; a.Metadata.ModelType == modelType).First();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var view = ModuleSettingsViews.Where(a =&amp;gt; a.Metadata.ModelType == modelType).First();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (view == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new InvalidOperationException(string.Format(&amp;quot;Unable to locate view with type {0}.&amp;quot;, modelType));    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return view.Value;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public T GetView&amp;lt;T&amp;gt;()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var view = this.container.GetExportedValueOrDefault&amp;lt;T&amp;gt;();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (view == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new InvalidOperationException(string.Format(&amp;quot;Unable to locate view with type {0}.&amp;quot;, typeof(T).Name));    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return view;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public Window CreateWindow&amp;lt;T&amp;gt;()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var view = this.GetView&amp;lt;T&amp;gt;(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return CreateWindow&amp;lt;T&amp;gt;(view); ;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public Window CreateWindow&amp;lt;T&amp;gt;(T content)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var window = new Window();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // window.DataContext = dataContext; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; window.Content = content; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return window;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public ModelSettingsViewWithRegions CreateModelSettingsViewWithRegions()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IRegionManager regionManager = this.container.GetExportedValueOrDefault&amp;lt;IRegionManager&amp;gt;();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ModelSettingsViewWithRegions view = new ModelSettingsViewWithRegions();// { DataContext = viewModel };    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.container.ComposeParts(view); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RegionManager.SetRegionManager(view, regionManager);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RegionManager.UpdateRegions();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return view;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;Lets take a closer look ate the    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [ImportMany(typeof(IModelSettingView))]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public IEnumerable&amp;lt;Lazy&amp;lt;IModelSettingView, IModelSettingMetadata&amp;gt;&amp;gt; ModuleSettingsViews { get; set; } &lt;/p&gt;  &lt;p&gt;ImportMany asks MEF to populate the IEnumerable with exported objects that implement IModelSettingView&amp;#160; &lt;br /&gt;If we take a look into the defintion of Lazy we see... &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; [Serializable]   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class Lazy&amp;lt;T, TMetadata&amp;gt; : Lazy&amp;lt;T&amp;gt;    &lt;br /&gt;...    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Summary:    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //&amp;#160;&amp;#160;&amp;#160;&amp;#160; Initializes a new instance of the System.Lazy&amp;lt;T,TMetadata&amp;gt; class with the    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //&amp;#160;&amp;#160;&amp;#160;&amp;#160; specified metadata that uses the specified function to get the referenced    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //&amp;#160;&amp;#160;&amp;#160;&amp;#160; object.    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Parameters:    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //&amp;#160;&amp;#160; valueFactory:    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //&amp;#160;&amp;#160;&amp;#160;&amp;#160; A function that returns the referenced object.    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //&amp;#160;&amp;#160; metadata:    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //&amp;#160;&amp;#160;&amp;#160;&amp;#160; The metadata associated with the referenced object.    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [TargetedPatchingOptOut(&amp;quot;Performance critical to inline this type of method across NGen image boundaries&amp;quot;)]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public Lazy(Func&amp;lt;T&amp;gt; valueFactory, TMetadata metadata);    &lt;br /&gt;... &lt;/p&gt;  &lt;p&gt;So what this is saying is that this function provides an interface to the meta data that is added in our Attribute. &lt;/p&gt;  &lt;p&gt;In our case the interface to the meta data is IModelSettingMetadata &lt;/p&gt;  &lt;p&gt;namespace ArchitectureExample.BusinessLayer.Entities   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public interface IModelSettingMetadata    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ModelType ModelType { get; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;This meta data is needed to identify the control we want to import. Within the function GetView we use a linq expression to find the modelview that we are interested in. Since this is an enumeration of type lazy we need to use .value to instantiate the view model. &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public IModelSettingView GetView(ModelType modelType)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var view = ModuleSettingsViews.Where(a =&amp;gt; a.Metadata.ModelType == modelType).First();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (view == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new InvalidOperationException(string.Format(&amp;quot;Unable to locate view with type {0}.&amp;quot;, modelType));    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return view.Value;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;This is used in the ModelSettings Controller... &lt;/p&gt;  &lt;p&gt;9. Here is the ModelSettingsController used in the MVVMC pattern &lt;/p&gt;  &lt;p&gt;namespace ArchitectureExample.PresentationLayer.WPF.Client.Views.ModelSettings   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class ModelSettingsController     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private ViewFactory viewFactory;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private ModelSettingsViewModel viewModel;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private ModelSettingsView view;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public ModelSettingsController(ViewFactory viewFactory,ModelSettingsViewModel viewModel, ModelSettingsView view)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.viewFactory = viewFactory;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.viewModel = viewModel;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.view = view;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //this.view.DataContext = viewModel;    &lt;br /&gt;//This listens to events created when the combobox changes    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.viewModel.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(viewModel_PropertyChanged);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; UpdateSpecificModelSettingsView();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; void viewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (e.PropertyName == &amp;quot;SelectedModelSetting&amp;quot;)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; UpdateSpecificModelSettingsView();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private void UpdateSpecificModelSettingsView()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (this.viewModel.SelectedModelSetting != null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;//==Here is where the Imported Enumeration of Lazy IModelSettingView are used    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var specificView = viewFactory.GetView(this.viewModel.SelectedModelSetting.Metadata.ModelType) as UserControl;    &lt;br /&gt;//Here we have to set the data context because we are changing the control    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; specificView.DataContext = this.viewModel.SelectedModelSetting.Value;    &lt;br /&gt;//Here we populate the place holder with our view (tightly coupled)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.view.SpecificModelSetting.Content = specificView; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; }   &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;10. The View model belonging to ModelSettingsView.xaml is ModelSettingsViewModel.cs   &lt;br /&gt;Inside this we expose Lazy Observable collections and selected values. Here we are using MVVMLite and the ViewModelBase. Actually we don't need to do this because WPF has an implementation of ICommand. &lt;/p&gt;  &lt;p&gt;using GalaSoft.MvvmLight;   &lt;br /&gt;using GalaSoft.MvvmLight.Command; &lt;/p&gt;  &lt;p&gt;namespace ArchitectureExample.PresentationLayer.WPF.Client.Views.ModelSettings   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [Export(typeof(ModelSettingsViewModel))]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //[PartCreationPolicy(CreationPolicy.NonShared)]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class ModelSettingsViewModel : ViewModelBase    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IModelSettingsService moduleSettingsService;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private ObservableCollection&amp;lt;Lazy&amp;lt;ModelSettingsBase, IModelSettingMetadata&amp;gt;&amp;gt; modelSettings;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private Lazy&amp;lt;ModelSettingsBase, IModelSettingMetadata&amp;gt; selectedModelSetting; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private RelayCommand&amp;lt;ModelSettingsBase&amp;gt; saveModelSettingsCommand; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public ObservableCollection&amp;lt;Lazy&amp;lt;ModelSettingsBase, IModelSettingMetadata&amp;gt;&amp;gt; ModelSettings   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return modelSettings;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private set    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (modelSettings != value)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; modelSettings = value; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RaisePropertyChanged(&amp;quot;ModelSettings&amp;quot;);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public Lazy&amp;lt;ModelSettingsBase, IModelSettingMetadata&amp;gt; SelectedModelSetting   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return selectedModelSetting;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (selectedModelSetting != value)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; selectedModelSetting = value; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RaisePropertyChanged(&amp;quot;SelectedModelSetting&amp;quot;);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SaveModelSettingsCommand.RaiseCanExecuteChanged();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public RelayCommand&amp;lt;ModelSettingsBase&amp;gt; SaveModelSettingsCommand   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (saveModelSettingsCommand == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; saveModelSettingsCommand = new RelayCommand&amp;lt;ModelSettingsBase&amp;gt;((ms) =&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // Save    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ms.Save();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; , (ms) =&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // CanSave    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return ms !=null &amp;amp;&amp;amp; ms.Validate();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return saveModelSettingsCommand;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [ImportingConstructor]   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public ModelSettingsViewModel(IModelSettingsService moduleSettingsService)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.moduleSettingsService = moduleSettingsService; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ModelSettings = new ObservableCollection&amp;lt;Lazy&amp;lt;ModelSettingsBase, IModelSettingMetadata&amp;gt;&amp;gt;(this.moduleSettingsService.GetModuleSettings());   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach (Lazy&amp;lt;ModelSettingsBase, IModelSettingMetadata&amp;gt; modelsettings in ModelSettings)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var test= modelsettings.Value;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;The interesting parts of the above are   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public RelayCommand&amp;lt;ModelSettingsBase&amp;gt; SaveModelSettingsCommand    &lt;br /&gt;Notice that in the can Execute Func we first chack if Ms !=null. Without this check first the function will throw an exception    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; , (ms) =&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // CanSave    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return ms !=null &amp;amp;&amp;amp; ms.Validate();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }); &lt;/p&gt;  &lt;p&gt;The ms.Validate part is invoking an implementation of an abstract class: &lt;/p&gt;  &lt;p&gt;namespace ArchitectureExample.BusinessLayer.Entities   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// This classes could be generated from a T4 template (pocos)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public abstract class ModelSettingsBase    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;summary&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// Just an example of a field    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; /// &amp;lt;/summary&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string Name    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get { return this.GetType().Name; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public abstract void Save();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public abstract bool Validate();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;11. Here is where we have implemented this within    &lt;br /&gt;namespace ArchitectureExample.BusinessLayer.Entities    &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class CreditDeductible : ModelSettingsBase    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public double Limit { get; set; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public double Deductible { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public CreditDeductible()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Limit = 100;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Deductible = 0;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void Save()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override bool Validate()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return Limit &amp;lt;= 100 &amp;amp;&amp;amp; Limit &amp;gt;= 0 &amp;amp;&amp;amp; Deductible &amp;lt;= 100 &amp;amp;&amp;amp; Deductible &amp;gt;= 0;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;Notice that we decided to use a boolean to return validation. The alternative would have been to use an exception. We choose boolean because exceptions are slow because they need to serialize the stack trace. &lt;/p&gt;  &lt;p&gt;There is a validation enterprise building block that uses attributes to set validation rules. We will look into using this because it provides a tidy way to associate validation rules to properties and will remove the untidy code in the Validate() function &lt;/p&gt;  &lt;p&gt;We tested this with 2 imported controls with 1 and 2 of these user controls. The OK button of the main control was properly enabled and disabled according to the validation rules. Also as we changed the combo box the values from one custom control to another where correctly persisted... &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-8380440949780330872?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/8380440949780330872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/8380440949780330872'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2011/02/swapping-wpf-controls-using-mvvmc-aka.html' title='Swapping WPF controls using MVVMC aka MVVM+Controller'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-8978558486071731798</id><published>2010-12-30T23:57:00.000-08:00</published><updated>2010-12-31T05:51:08.991-08:00</updated><title type='text'>Improvements in number crunching speeds from .Net 3.5 to .Net 4</title><content type='html'>Here's something interesting: In a previous blog entry we found a 2 times speedup in the performance of a C# version of our Cat Models from .Net 3.5 to .Net 4.0. I followed up with Microsoft on this and got a very helpfull feedback from Surupa Biswas and Stephen Toub:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;blockquote&gt;Hello again Nigel,&lt;br /&gt;&lt;br /&gt;Someone on my team took a deeper look at this and was able to deterministically reproduce a ~2x speed up on his box. It looks like the primary wins are coming from the CRT, not the JIT. The 8.0/3.5 CRT was using x87 floating point instructions, but the 10.0/4.0 CRT is using SSE.  The JIT uses the CRT for the Log/ Log10 and Exp calls. It seems like the SSE instructions used by the C runtime are the primary source of the wins although the JIT-ed code was better too.&lt;br /&gt;&lt;br /&gt; .NET 3.5 also had the CRT installed in a global location (WinSxS) and hence could be affected by other applications that updated the CRT, which could explain the differences in our observations.&lt;br /&gt;&lt;br /&gt;Thanks again for sharing your test case and reporting this to us.&lt;br /&gt;&lt;br /&gt;Best,&lt;br /&gt;Surupa&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;For the non technical:&lt;br /&gt;&lt;br /&gt;JIT = Just In Time (it is the compiler that converts the IL Intermediate code (what we see as .exe file) into a native executable)&lt;br /&gt;CRT = Common Runtime Library (It is all the libraries that the native code uses to interact with the hardware) This is a libray that is delivered with the framework and therefore has different versions:&lt;br /&gt;.NET 2.0 -&gt; CRT 8.0.50727.42&lt;br /&gt;.NET 2.0 SP1 -&gt; CRT 8.0.50727.762&lt;br /&gt;.NET 3.5 -&gt; CRT 9.0.21022.8&lt;br /&gt;.NET 3.5 SP1 -&gt; CRT 9.0.30729.1&lt;br /&gt;&lt;br /&gt;I believe SSE means Streaming SIMD Extensions which are a set of processor extensions for Intel processors&lt;br /&gt;&lt;br /&gt;From this web site http://neilkemp.us/src/sse_tutorial/sse_tutorial.html I found the following description of what SSE is &lt;br /&gt;"First what the heck is SSE? Basically SSE is a collection of 128 bit CPU registers. These registers can be packed with 4 32 bit scalars after which an operation can be performed on each of the 4 elements simultaneously."&lt;br /&gt;&lt;br /&gt;If I understand this correctly the .Net 4 takes advantage of certain processor extensions on the Intel processor via an improved version of the Common Runtime Library&lt;br /&gt;&lt;br /&gt;Here's a great article over the CLR improvements on .Net 3.5 http://msdn.microsoft.com/en-us/magazine/dd569747.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-8978558486071731798?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/8978558486071731798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/8978558486071731798'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2010/12/improvements-in-number-crunching-speeds.html' title='Improvements in number crunching speeds from .Net 3.5 to .Net 4'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-2679772376735822835</id><published>2010-12-21T11:18:00.001-08:00</published><updated>2010-12-21T11:18:05.287-08:00</updated><title type='text'>A WCF Hosting story</title><content type='html'>&lt;p&gt;I have a VS2010 project that has a WCF service that is ready to be deployed. I now want to setup IIS7 to use WAS to host the WCF components. Here are the steps needed to do this &lt;/p&gt;  &lt;p&gt;1. Goto Control Panel/Administrative Tools/Internet Information Services (IIS) Manager   &lt;br /&gt;2. Browse to Sites/Default Website    &lt;br /&gt;3. Right mouse click and &amp;quot;Add Virzual Directory...&amp;quot;    &lt;br /&gt;4. In the Add Virtual Directory    &lt;br /&gt;&amp;#160;&amp;#160; - Alias : 05    &lt;br /&gt;&amp;#160;&amp;#160; - Physical path: C:\InetPub\wwwroot\wmi\2010\12\05 &lt;/p&gt;  &lt;p&gt;(The objective is: To have a simple URL. Have the ability to version both the service and the namespaces. Monitor when decommissioning a service so as to prevent breaking applications [In our case done via logging in a base class]) &lt;/p&gt;  &lt;p&gt;5. Browse to Application Pools   &lt;br /&gt;6. Right mouse click on the list box and Add Application Pool....    &lt;br /&gt;7. Add Application Pool    &lt;br /&gt;&amp;#160;&amp;#160; - Name :Wmi    &lt;br /&gt;&amp;#160;&amp;#160; - .Net Framework v4.0.30319    &lt;br /&gt;&amp;#160;&amp;#160; - Managed pipeine mode : Integrated    &lt;br /&gt;8. Right mouse click on the newly created WMI service account and select Advanced Settings    &lt;br /&gt;9. Under Process Model click on the &amp;quot;...&amp;quot; button next to Identity    &lt;br /&gt;10. Select Custom account and enter the service account details &lt;/p&gt;  &lt;p&gt;At this point you could try and publish...   &lt;br /&gt;i Right mouse click on the ASP.NET project containing the WCF service    &lt;br /&gt;ii Enter    &lt;br /&gt;&amp;#160;&amp;#160; - Publish profile: BulsburgProfile    &lt;br /&gt;&amp;#160;&amp;#160; - Publish method: File Sysetm    &lt;br /&gt;&amp;#160;&amp;#160; - Target location \\chbbpresxxx\wwwroot$\wmi\2010\12\05    &lt;br /&gt;Then if you enter the url to the service &lt;a href="http://chbbpresxxx/wmi/Disk.svc"&gt;http://chbbpresxxx/wmi/Disk.svc&lt;/a&gt; you will get the following error    &lt;br /&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Server Error in '/' Application.      &lt;br /&gt;________________________________________      &lt;br /&gt;Runtime Error       &lt;br /&gt;Description: An application error occurred on the server. The current custom error settings for this application prevent the details of the application error from being viewed remotely (for security reasons). It could, however, be viewed by browsers running on the local server machine. &lt;/p&gt;    &lt;p&gt;Details: To enable the details of this specific error message to be viewable on remote machines, please create a &amp;lt;customErrors&amp;gt; tag within a &amp;quot;web.config&amp;quot; configuration file located in the root directory of the current web application. This &amp;lt;customErrors&amp;gt; tag should then have its &amp;quot;mode&amp;quot; attribute set to &amp;quot;Off&amp;quot;. &lt;/p&gt;    &lt;p&gt;&amp;lt;!-- Web.Config Configuration File --&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;configuration&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;system.web&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;customErrors mode=&amp;quot;Off&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/system.web&amp;gt;      &lt;br /&gt;&amp;lt;/configuration&amp;gt; &lt;/p&gt;    &lt;p&gt;Notes: The current error page you are seeing can be replaced by a custom error page by modifying the &amp;quot;defaultRedirect&amp;quot; attribute of the application's &amp;lt;customErrors&amp;gt; configuration tag to point to a custom error page URL. &lt;/p&gt;    &lt;p&gt;&amp;lt;!-- Web.Config Configuration File --&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;configuration&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;system.web&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;customErrors mode=&amp;quot;RemoteOnly&amp;quot; defaultRedirect=&amp;quot;mycustompage.htm&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/system.web&amp;gt;      &lt;br /&gt;&amp;lt;/configuration&amp;gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So now we add the following to Web.Config and republish   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;system.web&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;customErrors mode=&amp;quot;Off&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/system.web&amp;gt; &lt;/p&gt;  &lt;p&gt;Then you will get the following error:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;     &lt;br /&gt;Server Error in '/' Application.       &lt;br /&gt;________________________________________      &lt;br /&gt;The type 'Ccp.Wcf.Wmi.Disk', provided as the Service attribute value in the ServiceHost directive, or provided in the configuration element system.serviceModel/serviceHostingEnvironment/serviceActivations could not be found.       &lt;br /&gt;Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.      &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The solution is to   &lt;br /&gt;11. Go back to the Internet Information Services (IIS) Manager    &lt;br /&gt;12. Right mouse click on the newly created virtual directory and select &amp;quot;Convert to Application&amp;quot;    &lt;br /&gt;13. - Alias: wmi    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - Application pool: wmi    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; - Physical path: C:\InetPub\wwwroot\wmi\2010\12\05    &lt;br /&gt;Then it works...&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Next I want to add the finishing touches to the web.config    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;system.serviceModel&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;services&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;service behaviorConfiguration=&amp;quot;Ccp.Wcf.Wmi.DiskBehavior&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; name=&amp;quot;Ccp.Wcf.Wmi.Disk&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;endpoint address=&amp;quot;&amp;quot; binding=&amp;quot;wsHttpBinding&amp;quot; contract=&amp;quot;Ccp.Wcf.Wmi.IDisk&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;identity&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;dns value=&amp;quot;localhost&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/identity&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/endpoint&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;endpoint address=&amp;quot;mex&amp;quot; binding=&amp;quot;mexHttpBinding&amp;quot; contract=&amp;quot;IMetadataExchange&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;host&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;baseAddresses&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- We don't need a base address when deploying to production --&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!--add baseAddress=&amp;quot;&lt;a href="http://localhost:8731/Design_Time_Addresses/Ccp.Wcf.Wmi/Disk/&amp;quot;"&gt;http://localhost:8731/Design_Time_Addresses/Ccp.Wcf.Wmi/Disk/&amp;quot;&lt;/a&gt; /--&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/baseAddresses&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/host&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/service&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/services&amp;gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;If you happen to try the same thing on IIS6 there are some differences:   &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;1. Inside the Internet Information Services (IIS) Manager   &lt;br /&gt;2. Browse to Web Service Extentions and enable ASP.NET v4.0.30319    &lt;br /&gt;3. Repeat the excersize of creating the application pool and virtual directory    &lt;br /&gt;4. Copy the bin and the web.config file from C:\InetPub\wwwroot\wmi\2010\12\05 to C:\InetPub\wwwroot\    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Then when you try to do some special WMI calls you will end up with some errors like : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)). In our case the IIS6 Server is a fringe server that will be updated to Server 2008   &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;So now taking our system administrator hat off and putting our developer hat back on. We have an client app.config file that looks like:   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;endpoint address=&amp;quot;&lt;a href="http://chbbpresxxx.global.partnerre.net/Wmi/2010/12/05/Disk.svc&amp;quot;"&gt;http://chbbpresxxx.global.partnerre.net/Wmi/2010/12/05/Disk.svc&amp;quot;&lt;/a&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; binding=&amp;quot;wsHttpBinding&amp;quot; bindingConfiguration=&amp;quot;DiskwsHttp&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; contract=&amp;quot;WmiDeployedServiceReference.IDisk&amp;quot; name=&amp;quot;DiskwsHttpBalsburg&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;identity&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;dns value=&amp;quot;localhost&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/identity&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/endpoint&amp;gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;NB the dns entry is necessary otherwise the service will not be found   &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;The corresponding code is as follows:&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [TestMethod]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void GetFreeSpaceInGBWCfDeployed_CheckDiskCapacityOnC_StringContainingDiskCapacity()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WmiDeployedServiceReference.DiskClient proxy = new WmiDeployedServiceReference.DiskClient(&amp;quot;DiskwsHttpBalsburg&amp;quot;); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string diskCapacityString = &amp;quot;&amp;quot;;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string serverName = Environment.MachineName;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string driveLetter = &amp;quot;C&amp;quot;; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; diskCapacityString = proxy.GetFreeSpaceInGB(serverName, driveLetter); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; long AvailableSpaceOnC = 0; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DriveInfo d = new DriveInfo(driveLetter);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AvailableSpaceOnC = d.AvailableFreeSpace;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AvailableSpaceOnC = AvailableSpaceOnC / 1024 / 1024 / 1024; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; long diskCapacityLong = Convert.ToInt64(Convert.ToDouble(diskCapacityString)); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Assert.IsFalse(diskCapacityString == &amp;quot;&amp;quot;);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Assert.IsTrue(diskCapacityLong == AvailableSpaceOnC); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;Now I want to use NetTcp because it is more efficient than wsHttp.   &lt;br /&gt;In some early iterations after adding the netTcp binding when I try &lt;a href="http://chbbpresxxx/wmi/2010/12/05/Disk.svc"&gt;http://chbbpresxxx/wmi/2010/12/05/Disk.svc&lt;/a&gt;    &lt;br /&gt;I get the error like an error like:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;     &lt;br /&gt;Server Error in '/Wmi/2010/12/05' Application.      &lt;br /&gt;-------------------------------------------------------------------------------- &lt;/p&gt;    &lt;p&gt;Could not find a base address that matches scheme net.tcp for the endpoint with binding NetTcpBinding. Registered base address schemes are [http].      &lt;br /&gt;Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.       &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;To fix this error you need to add the net.tcp binding to the binding of the application in IIS.   &lt;br /&gt;1. Right click the virtual directory/application in IIS -&amp;gt; Manage application -&amp;gt; Advanced settings.    &lt;br /&gt;2. On the Enabled Protocols : http,net.tcp    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;I tried out the WCF configuration editor to setup a simple net-Tcp binding to the existing contract and I publish it. Then when I open the &lt;a href="http://chbbpresxxx/wmi/2010/12/05/Disk.svc"&gt;http://chbbpresxxx/wmi/2010/12/05/Disk.svc&lt;/a&gt; I got the error:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;     &lt;br /&gt;Cannot load the X.509 certificate identity specified in the configuration.       &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The solution in my case was to comment out the certificate in the web.config&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;endpoint binding=&amp;quot;wsHttpBinding&amp;quot; name=&amp;quot;DiskwsHttp&amp;quot; contract=&amp;quot;Ccp.Wcf.Wmi.IDisk&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; listenUriMode=&amp;quot;Explicit&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;identity&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;dns value=&amp;quot;localhost&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!--certificateReference storeName=&amp;quot;My&amp;quot; storeLocation=&amp;quot;LocalMachine&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x509FindType=&amp;quot;FindBySubjectDistinguishedName&amp;quot; /--&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/identity&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/endpoint&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;endpoint address=&amp;quot;mex&amp;quot; binding=&amp;quot;mexHttpBinding&amp;quot; contract=&amp;quot;IMetadataExchange&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; listenUriMode=&amp;quot;Explicit&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;identity&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!--certificateReference storeName=&amp;quot;My&amp;quot; storeLocation=&amp;quot;LocalMachine&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; x509FindType=&amp;quot;FindBySubjectDistinguishedName&amp;quot; /--&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/identity&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/endpoint&amp;gt;&lt;/p&gt;  &lt;p&gt;Alternatively you can follow the instructions in the following url to setup the certificate &lt;/p&gt; &lt;a title="http://wcfsecurity.codeplex.com/wikipage?title=How%20To%20-%20Create%20and%20Install%20Temporary%20Certificates%20in%20WCF%20for%20Message%20Security%20During%20Development&amp;amp;ProjectName=wcfsecurity&amp;#13;&amp;#10;" href="http://wcfsecurity.codeplex.com/wikipage?title=How%20To%20-%20Create%20and%20Install%20Temporary%20Certificates%20in%20WCF%20for%20Message%20Security%20During%20Development&amp;amp;ProjectName=wcfsecurity"&gt;http://wcfsecurity.codeplex.com/wikipage?title=How%20To%20-%20Create%20and%20Install%20Temporary%20Certificates%20in%20WCF%20for%20Message%20Security%20During%20Development&amp;amp;ProjectName=wcfsecurity   &lt;br /&gt;&lt;/a&gt;  &lt;p&gt;   &lt;br /&gt;After some other edits for the wsHttp binding works but the net-tcp binding gives an error like     &lt;br /&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Could not connect to net.tcp://chbbpresxxx.global.partnerre.net:8731/Wmi/2010/12/05/Disk.svc. The connection attempt lasted for a time span of 00:00:01.1986602. TCP error code 10061: No connection could be made because the target machine actively refused it 10.102.65.150:8731.     &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This error had me stuck for a while, I tried a lot of things, all failed. Here is a list:   &lt;br /&gt;- Look at the Advanced settings of wwwroot and add http,net.tcp to the enabled protocols (as in the Virtual directory)    &lt;br /&gt;- Right mouse click on wwwroot and add Binding.    &lt;br /&gt;&amp;#160;&amp;#160; - Modified existing binging from 808:* to 9* to 9001 and back    &lt;br /&gt;&amp;#160;&amp;#160; - Adding net-tcp with 9001    &lt;br /&gt;- Under Server Manager/Configuration/Microsoft Fire Wall with.../ look at the properties and set Firewall status to off at doamin, private and public levels    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;The problem was the setup of Features where different. To fix this we have to put on our system administrator hat on and do the following: &lt;/p&gt;  &lt;p&gt;1. Open the Server Manager   &lt;br /&gt;2. Browse to Server Manager/features    &lt;br /&gt;3. Add Under .Net Framework 3.0 Features (Installed)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Under WCF Activation    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; + HTTP Activation     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; + Non HTTP Activations    &lt;br /&gt;4. The installation took some time &lt;/p&gt;  &lt;p&gt;Now if we try the test client by:   &lt;br /&gt;1. D:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\WcfTestClient.exe    &lt;br /&gt;2. File/ Add Service     &lt;br /&gt;3. &lt;a href="http://chbbpresxxx.global.partnerre.net/Wmi/2010/12/05/Disk.svc"&gt;http://chbbpresxxx.global.partnerre.net/Wmi/2010/12/05/Disk.svc&lt;/a&gt;    &lt;br /&gt;We get the error &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;     &lt;br /&gt;Error: Cannot obtain Metadata from &lt;a href="http://chbbpresxxx.global.partnerre.net/Wmi/2010/12/05/Disk.svc"&gt;http://chbbpresxxx.global.partnerre.net/Wmi/2010/12/05/Disk.svc&lt;/a&gt;      &lt;br /&gt;If this is a Windows (R) Communication Foundation service to which you have access, please check that you have enabled metadata publishing at the specified address.&amp;#160; For help enabling metadata publishing, please refer to the MSDN documentation at &lt;a href="http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata"&gt;http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata&lt;/a&gt; Exchange etc etc      &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I found a link that describes what is happening &lt;/p&gt; &lt;a title="http://blogs.msdn.com/b/webtopics/archive/2010/04/28/system-typeloadexception-for-system-servicemodel-activation-httpmodule-in-asp-net-4.aspx&amp;#13;&amp;#10;" href="http://blogs.msdn.com/b/webtopics/archive/2010/04/28/system-typeloadexception-for-system-servicemodel-activation-httpmodule-in-asp-net-4.aspx"&gt;http://blogs.msdn.com/b/webtopics/archive/2010/04/28/system-typeloadexception-for-system-servicemodel-activation-httpmodule-in-asp-net-4.aspx   &lt;br /&gt;&lt;/a&gt;  &lt;blockquote&gt;   &lt;p&gt;Installation of .NET 3.5.1 WCF HTTP activation feature adds a global module for the 3.0 framework’s 'System.ServiceModel’ assembly for the type 'System.ServiceModel.Activation.HttpModule'. Since the application pool’s runtime version is v4.0, this assembly is tried to be loaded from the .NET 4 assemblies folder. Since, the definition of the 'System.ServiceModel.Activation.HttpModule’ is now moved to the “System.ServiceModel.Activation” assembly, it fails. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Following the instructions the to fix this open a command prompt:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;#160; &lt;br /&gt;C:\&amp;gt;cd C:\Windows\Microsoft.NET\Framework\v4.0.30319      &lt;br /&gt;C:\Windows\Microsoft.NET\Framework\v4.0.30319&amp;gt;aspnet_regiis -iru      &lt;br /&gt;Start installing ASP.NET (4.0.30319).      &lt;br /&gt;..................................      &lt;br /&gt;Finished installing ASP.NET (4.0.30319). &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Then reboot the server...   &lt;br /&gt;By the way the following error happens when I tried adding a Binding in the IIS Manager for net-tcp port 9001    &lt;br /&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;The protocol binding '9001' does not conform to the syntax for 'net.tcp'. The following is an example of valid 'net.tcp' protocol bindings: '808:*'.      &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The solution is to remove the added net-tcp binding from the IIS Server Manager.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;strong&gt;The Final Solution with our developer hat on&lt;/strong&gt;&lt;/p&gt; &lt;strong&gt;&lt;/strong&gt;  &lt;p&gt;   &lt;br /&gt;We use baseAddress=&amp;quot;net.tcp://localhost:8080/Wmi/2010/12/05/Disk.svc&amp;quot; in the Web.config that looks like:    &lt;br /&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;     &lt;br /&gt;&amp;lt;configuration&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;system.web&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;compilation debug=&amp;quot;true&amp;quot; targetFramework=&amp;quot;4.0&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;customErrors mode=&amp;quot;Off&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/system.web&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;system.serviceModel&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;services&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;service behaviorConfiguration=&amp;quot;Ccp.Wcf.Wmi.DiskBehavior&amp;quot; name=&amp;quot;Ccp.Wcf.Wmi.Disk&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;clear /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;endpoint binding=&amp;quot;wsHttpBinding&amp;quot; name=&amp;quot;DiskwsHttp&amp;quot; contract=&amp;quot;Ccp.Wcf.Wmi.IDisk&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; listenUriMode=&amp;quot;Explicit&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;identity&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;dns value=&amp;quot;localhost&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/identity&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/endpoint&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;endpoint address=&amp;quot;mex&amp;quot; binding=&amp;quot;mexHttpBinding&amp;quot; contract=&amp;quot;IMetadataExchange&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; listenUriMode=&amp;quot;Explicit&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;identity&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/identity&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/endpoint&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;endpoint address=&amp;quot;&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; binding=&amp;quot;netTcpBinding&amp;quot;&amp;#160; name=&amp;quot;DisknetTcp&amp;quot; contract=&amp;quot;Ccp.Wcf.Wmi.IDisk&amp;quot; &amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;identity&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;dns value=&amp;quot;localhost&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/identity&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/endpoint&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;host&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;baseAddresses&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- We don't need a base address when deploying to production --&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;add baseAddress=&amp;quot;net.tcp://localhost:8080/Wmi/2010/12/05/Disk.svc&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/baseAddresses&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/host&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/service&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/services&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;behaviors&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceBehaviors&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;behavior name=&amp;quot;Ccp.Wcf.Wmi.DiskBehavior&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- To avoid disclosing metadata information,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set the value below to false and remove the metadata endpoint above before deployment --&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceMetadata httpGetEnabled=&amp;quot;True&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;!-- To receive exception details in faults for debugging purposes,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; set the value below to true.&amp;#160; Set to false before deployment       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; to avoid disclosing exception information --&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;serviceDebug includeExceptionDetailInFaults=&amp;quot;true&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/behavior&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/serviceBehaviors&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/behaviors&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;bindings&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;netTcpBinding&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;binding name=&amp;quot;ReliableSessionBinding&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;reliableSession ordered=&amp;quot;false&amp;quot; inactivityTimeout=&amp;quot;00:10:00&amp;quot; enabled=&amp;quot;true&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/binding&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;binding name =&amp;quot;DisknetTcp&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/binding&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/netTcpBinding&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/bindings&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;client&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;endpoint address=&amp;quot;net.tcp://services-tst.global.partnerre.net/Group/Common/Logging/2009/02/11/LogService.svc&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; binding=&amp;quot;netTcpBinding&amp;quot; bindingConfiguration=&amp;quot;ReliableSessionBinding&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; contract=&amp;quot;LogServiceReference.ILogService&amp;quot; &amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;identity&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;servicePrincipalName value=&amp;quot;host/CHBBPRES563.global.partnerre.net&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/identity&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/endpoint&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/client&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/system.serviceModel&amp;gt;      &lt;br /&gt;&amp;lt;/configuration&amp;gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;We use address=&amp;quot;net.tcp://chbbpresxxx.global.partnerre.net/Wmi/2010/12/05/Disk.svc&amp;quot;in the App.config, that ends up looking like:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;     &lt;br /&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;      &lt;br /&gt;&amp;lt;configuration&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;system.serviceModel&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;client&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;endpoint address=&amp;quot;&lt;a href="http://chbbpresxxx.global.partnerre.net/Wmi/2010/12/05/Disk.svc&amp;quot;"&gt;http://chbbpresxxx.global.partnerre.net/Wmi/2010/12/05/Disk.svc&amp;quot;&lt;/a&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; binding=&amp;quot;wsHttpBinding&amp;quot; bindingConfiguration=&amp;quot;DiskwsHttp&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; contract=&amp;quot;WmiDeployedServiceReference.IDisk&amp;quot; name=&amp;quot;DiskwsHttpBalsburg&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;identity&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;dns value=&amp;quot;localhost&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/identity&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/endpoint&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;endpoint address=&amp;quot;&lt;a href="http://localhost:8732/Design_Time_Addresses/Ccp.Wcf.Wmi/Disk/&amp;quot;"&gt;http://localhost:8732/Design_Time_Addresses/Ccp.Wcf.Wmi/Disk/&amp;quot;&lt;/a&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; binding=&amp;quot;wsHttpBinding&amp;quot; bindingConfiguration=&amp;quot;WSHttpBinding_IDisk&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; contract=&amp;quot;WmiServiceReference.IDisk&amp;quot; name=&amp;quot;WSHttpBinding_IDisk&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;identity&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;dns value=&amp;quot;localhost&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/identity&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/endpoint&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;endpoint address=&amp;quot;net.tcp://localhost:8731/Wmi/2010/12/05/Disk&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; binding=&amp;quot;netTcpBinding&amp;quot; contract=&amp;quot;WmiServiceReference.IDisk&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; name=&amp;quot;NetTcpBinding_IDisk&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;identity&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;dns value=&amp;quot;localhost&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/identity&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/endpoint&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;endpoint address=&amp;quot;&lt;a href="http://chbbpresxxx.global.partnerre.net/Wmi/2010/12/05/Disk.svc&amp;quot;"&gt;http://chbbpresxxx.global.partnerre.net/Wmi/2010/12/05/Disk.svc&amp;quot;&lt;/a&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; binding=&amp;quot;wsHttpBinding&amp;quot; bindingConfiguration=&amp;quot;DiskwsHttp1&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; contract=&amp;quot;WmiDeployedServiceReference.IDisk&amp;quot; name=&amp;quot;DiskwsHttp&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;identity&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;dns value=&amp;quot;localhost&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/identity&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/endpoint&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;endpoint address=&amp;quot;net.tcp://chbbpresxxx.global.partnerre.net/Wmi/2010/12/05/Disk.svc&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; binding=&amp;quot;netTcpBinding&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; contract=&amp;quot;WmiDeployedServiceReference.IDisk&amp;quot; name=&amp;quot;DisknetTcp&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;identity&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;dns value=&amp;quot;localhost&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/identity&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/endpoint&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/client&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/system.serviceModel&amp;gt;      &lt;br /&gt;&amp;lt;/configuration&amp;gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;And the unit test looks like:   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [TestMethod]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void GetFreeSpaceInGBWCfDeployedTcp_CheckDiskCapacityOnC_StringContainingDiskCapacity()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WmiDeployedServiceReference.DiskClient proxy = new WmiDeployedServiceReference.DiskClient(&amp;quot;DisknetTcp&amp;quot;); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string diskCapacityString = &amp;quot;&amp;quot;;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string serverName = Environment.MachineName;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string driveLetter = &amp;quot;C&amp;quot;; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; diskCapacityString = proxy.GetFreeSpaceInGB(serverName, driveLetter); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; long AvailableSpaceOnC = 0; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DriveInfo d = new DriveInfo(driveLetter);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AvailableSpaceOnC = d.AvailableFreeSpace;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AvailableSpaceOnC = AvailableSpaceOnC / 1024 / 1024 / 1024; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; long diskCapacityLong = Convert.ToInt64(Convert.ToDouble(diskCapacityString)); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Assert.IsFalse(diskCapacityString == &amp;quot;&amp;quot;);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Assert.IsTrue(diskCapacityLong == AvailableSpaceOnC); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-2679772376735822835?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/2679772376735822835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/2679772376735822835'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2010/12/wcf-hosting-story.html' title='A WCF Hosting story'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-3646922023392876379</id><published>2010-11-25T23:52:00.000-08:00</published><updated>2010-11-26T00:52:30.789-08:00</updated><title type='text'>Number crunching</title><content type='html'>The benchmark tests that were carried out last year to include code generated with VS2010 and .Net 4.0. There was a significant improvement in speed (more than 10 times) which makes a model that has been completely written in C# about 0.7 times as fast as code written in unmanaged C++. We are looking into Intel C++ compiler options to determine if we are missing something. But the outcome is that it is no longer a clear cut decision between managed C# an unmanaged C++. The 30% drop in performance could be compensated with the business value of having all code in one domain.&lt;br /&gt;&lt;br /&gt;For completeness: It is well know that Fortran compilers are more efficient than C and are used for the core algorithms in most super computer sites. Our test cases showed that this is 5 times faster than C#/C++ solution that we have now. If we compile everything in Intel C++ we get a 30% speed up on 32 bit and a 40% speed up on 64 bit.&lt;br /&gt;&lt;br /&gt;Although we reserve the right to write code in the most efficient language available there is a lot of value in keeping to standard well know languages. We therefore considered 3 options:&lt;br /&gt;&lt;br /&gt;1. Everything in C++&lt;br /&gt;2. Everything in C#&lt;br /&gt;3. The Event loop in C# and the location loop in C++&lt;br /&gt;&lt;br /&gt;The idea of options 1 and 2 is to have everything in the same domain. This makes it easier to optimize both the event and the location loops. This is important for the case when we want to look into per risk policies. This is because instead of having an event loop as the outer loop it makes more sense to have the exposure location loop as the outer loop since instead of summing on an event basis we are summing on a per risk basis. The point is that the exposure table is very big and it is expensive to make copies of this data, hence it is better to change the inner and outer loop.&lt;br /&gt;&lt;br /&gt;The decision was for option 3 for the following reasons:&lt;br /&gt;- Preserves existing investment&lt;br /&gt;- There will always be a need for a mathematical library, having this in unmanaged code is the optimal way from a compute point of view and allows portability (eg super computers)&lt;br /&gt;- The Per Risk Policies would be handled by adding new functionality to the existing library&lt;br /&gt;- The readability of the code will be improved by writing some more specific functions within the mathematical library&lt;br /&gt;&lt;br /&gt;The discussions showed that by choosing this option we do give up the following things:&lt;br /&gt;- A homogenous language where there is complete freedom over how to optimize and arrange code. &lt;br /&gt;- There is a need to maintain know-how in 2 languages and there is an associated barrier for scientists to understand, debug and further develop core mathematical libraries&lt;br /&gt;- IT will not be able to support C++. (This is not such a big issue because a deep domain knowledge is required which would make such collaboration difficult in the first place)&lt;br /&gt;&lt;br /&gt;With the choice of language made we can look more seriously into the structure of base classes where code could be shared between the different peril models. The base class would consist of a template method pattern that would execute methods for:&lt;br /&gt;&lt;br /&gt;- Loading exposure&lt;br /&gt;- Disaggregation&lt;br /&gt;- Running the Event Loop&lt;br /&gt;- Calculating Ground up loss&lt;br /&gt;- Calculating loss sigma&lt;br /&gt;- Applying policy structures&lt;br /&gt;&lt;br /&gt;The idea is that the models would override the model specific operations.&lt;br /&gt;&lt;br /&gt;For the loading of exposure to work we need to use one exposure format.&lt;br /&gt;&lt;br /&gt;Disaggregation: the conversion of locators into a distribution of lat long point values according to distributions like population, industry exposure, Commercial and residential distribution etc seems to be an operation that is quite independent. But the models make choices such as vulnerability, soil type etc based on geographic location. It is much easier to derive this information from a locator than to determine in which location a lat long is located. Although the building of such a database sounds a simple task there are implications on how we understand the model output. Basically it is important to have a thorough understanding of disaggregation in order to understand the model results and to make an underwriting decision that makes sense. &lt;br /&gt;&lt;br /&gt;Looking at how we want to host the models on a server farm&lt;br /&gt;&lt;br /&gt;We are looking into service providers that would allow us to rent virtual machines on a seasonal basis. It is not clear whether we will find a provider that is willing to do this at an appropriate price.&lt;br /&gt;&lt;br /&gt;Our computational needs are not the same as some of the Reinsurance companies that rely completely on Vendor models. Since the license fee for the HPC with RMS is significant we don’t have an immediate advantage of using HPC for RMS. The existing Scheduler for the common platform is working well therefore there is no pressure from this side. &lt;br /&gt;&lt;br /&gt;There is value in using a scheduler that has an industry following. There is also value in choosing a scheduler that will be commonly used in our industry. There could be value in the ability to scale out on VM Roles in the cloud. From a pure number crunching point of view the first priority should be to make the number crunching modules as efficient as possible by optimizing algorithms and choice of compiler etc.&lt;br /&gt;&lt;br /&gt;We had a discussion over distributed computing. Algorithms such as finite element analysis need to pass an entire interface between iterations and will therefore cause a lot of messages to be passed with MPI. In this case it is really important that the compute nodes very well connected. In the case of cat modeling we are passing some totals between iterations and therefore MPI messages are very small. Therefore it might not be so essential that the compute nodes are very well connected. In the case of Windstorm models algoritm speed is disk io bound because the bottle neck is on reading storm footprint files, in which case it would make sense to partition jobs based on storm footprints.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-3646922023392876379?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/3646922023392876379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/3646922023392876379'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2010/11/number-crunching.html' title='Number crunching'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-6647055910293762377</id><published>2010-11-25T04:59:00.000-08:00</published><updated>2010-11-25T05:01:44.875-08:00</updated><title type='text'>My first steps in Azure Cloud Computing</title><content type='html'>Here's a log of my first experiments in Azure. To start of with it's good to have a plan of what to learn. This is what I came up with :&lt;br /&gt;&lt;br /&gt;1. Development Environment&lt;br /&gt;   -&gt; Now works on PDC laptop&lt;br /&gt;2. Storage Model&lt;br /&gt;     - Blobs&lt;br /&gt;     - Tables&lt;br /&gt;     - Cache&lt;br /&gt;3. How to initialize data in the cloud&lt;br /&gt;4. How to extract data from the cloud&lt;br /&gt;5. Simple UI&lt;br /&gt;6. Data Access layer&lt;br /&gt;7. Worker Roles&lt;br /&gt;8. Cache&lt;br /&gt;9. Test Driven Development&lt;br /&gt;&lt;br /&gt;Setting up the development environment has some hurdles. Firstly it does not seem to work on WindowsXP and it requires IIS7. Here's a list of steps:&lt;br /&gt;&lt;br /&gt;1. Open VS2010&lt;br /&gt;2. Select the Cload Project&lt;br /&gt;3. Click on Download Windows Azure Tools&lt;br /&gt;   Windows Azure Tools for Microsoft Visual Studio 1.2 (June 2010) &lt;br /&gt;4. Click Download&lt;br /&gt;5. Run&lt;br /&gt;6. Run&lt;br /&gt;&lt;br /&gt;This time it worked well. When you run an Azure application in debug mode you need to start the AppFabric service on your PC. To do this there is a component installed ion the Azure SDK section of the start menu.&lt;br /&gt;&lt;br /&gt;I had no problems in starting the Development AppFabric but could not start the development storage&lt;br /&gt;&lt;br /&gt;To get around this I ran c:\Program Files\Windows Azure SDK\v1.2\bin\devstore\dsservice.exe which produced an error:&lt;br /&gt;&lt;br /&gt;A network-related or instance-specific error occured while establishing a connection to SQL Server. The server was not found  or was not accessible. Verify that the instance name is correct and that the SQL Server is configured to allow remote connections.( provider SQL Network Interfaces, error 26 - Error Locating Server/Instance Specified)&lt;br /&gt;&lt;br /&gt;I started the SQL Server Service and tried again. and I was able to run my hallo world Azure application.&lt;br /&gt;&lt;br /&gt;The next thing I wanted to do is see how easy it would be to deploy this to Azure To do this I did the following steps&lt;br /&gt;&lt;br /&gt;1. Right mouse click cloud project an select publish&lt;br /&gt;2. create a certificate and install on pc&lt;br /&gt;3. export certificate to file&lt;br /&gt;4. import certificate to azure&lt;br /&gt;5. create storage and servce accounts&lt;br /&gt;6. This takes a long time&lt;br /&gt;&lt;br /&gt;Then I got the warning:&lt;br /&gt;&lt;br /&gt;WARNING: This deployment has at least one role with only one instance. We recommend that you deploy at least two instances per role to ensure high availability in case one of the instances becomes unavailable. Doing so also enables coverage of the Windows Azure Compute SLA, which guarantees 99.95% uptime. For more information please visit this link. &lt;br /&gt;&lt;br /&gt;To correct this:&lt;br /&gt;1. Goto WebRoleTable under Roles in the TableCloadService subproject&lt;br /&gt;2. Increase the instance count by 1 to 2&lt;br /&gt;&lt;br /&gt;This got rid of the error message but the package could not be deployed to staging.&lt;br /&gt;&lt;br /&gt;Some hallo world experiments later I got a message from Microsoft:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sehr geehrte(r) Nigel Findlater!&lt;br /&gt;&lt;br /&gt;Diese E-Mail-Benachrichtigung soll Sie über Ihre Nutzung von Windows Azure Platform informieren.  Nach unseren Aufzeichnungen hat Ihr Abonnement 125 % der Angebots-Servernutzungszeit für den aktuellen Abrechnungszeitraum überschritten.  Für alle Stunden, die die im Abonnement inbegriffenen Zeiten übersteigen, fallen Standardgebühren an.  &lt;br /&gt;&lt;br /&gt;Nachstehend sind die Nutzungswerte bis zum jetzigen Zeitpunkt im Rahmen des laufenden Abrechnungszeitraums aufgeführt.&lt;br /&gt;&lt;br /&gt;: 42.000000 &lt;br /&gt;&lt;br /&gt;Soweit dieser Wert nicht unerwartet ist, sind keine Handlungen Ihrerseits erforderlich.  Sollte der Nutzungswert unerwartet sein, melden Sie sich beim Windows Azure Dev-Portal an, um Ihre derzeit beanspruchten Dienste einzusehen, und nehmen Sie die erforderlichen Änderungen an diesen Diensten vor, um Ihre Nutzung wieder auf einen Nominalwert zu bringen.&lt;br /&gt;&lt;br /&gt;Sie können sich jederzeit beim Microsoft Online Services-Kundenportal unter https://mocp.microsoftonline.com anmelden, um die Nutzungszeiten Ihres Abonnements einzusehen.  Wenn Sie hier klicken, erhalten Sie detaillierte Anweisungen dazu, wie die Nutzungsinformationen auf Ihren Rechnungen zu lesen und auszulegen sind.&lt;br /&gt;&lt;br /&gt;Antworten Sie nicht auf diese E-Mail. Das Postfach wird nicht überwacht.   Wenn Sie Kundensupport benötigen, wenden Sie sich an einen Customer Partner Care-Mitarbeiter, indem Sie auf den folgenden&lt;br /&gt;8&lt;--&lt;br /&gt;&lt;br /&gt;Name                     Ressource                          Verbraucht  Inklusive  Fakturierbar  Satz      Betrag  &lt;br /&gt;Windows Azure Compute    Rechenstunden                      43.000000   25.000000  18.000000     0.132000  CHF 2.38  &lt;br /&gt;Windows Azure-Speicher   Speichertransaktionen (in 10.000)  0.027800    1.000000   0.000000      0.011000  CHF 0.00 &lt;br /&gt;&lt;br /&gt;This translates to 2.50 CHF which won't break the bank. I am surprised that a couple of Hallo world applications deployed to staging could run up more than 50 hours of compute time. To be sure that the time did not build up any more I delete the application and services. Next I am going to take a much closer look at http://msdn.microsoft.com/en-us/windowsazure/ff796218.aspx and order a book.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-6647055910293762377?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/6647055910293762377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/6647055910293762377'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2010/11/my-first-steps-in-azure-cloud-computing.html' title='My first steps in Azure Cloud Computing'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-2400593081140864373</id><published>2010-11-11T05:49:00.000-08:00</published><updated>2010-11-11T08:09:47.561-08:00</updated><title type='text'>Notes from PDC2010</title><content type='html'>&lt;strong&gt;High Performance Computing (HPC Server)&lt;/strong&gt; &lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;font-size:100%;"&gt;There is a re-insurance industrial move towards HPC Servers for modeling. RMS and AIR are planning to use HPC Servers as a platform for scheduling number crunching nat cat models. &lt;/span&gt;&lt;/div&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;font-size:100%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;font-size:100%;"&gt;The news is that the HPC Server Scheduler will support Azure computing nodes in the Cloud. This is very interesting for BUCat because for a large portion of the year the modeling machines are not under heavy load. The advantage of having cloud nodes is that we could scale out during the renewal seasons and scale back when we don’t need the computational power. &lt;/span&gt;&lt;/div&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;font-size:100%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;font-size:100%;"&gt;Since there is currently no fast connection between cloud nodes you must be careful when using MPI because the performance depends on the lowest connection. To get around this there are small medium and large hpc nodes that can ensure that processing takes place on the same box. I was talking to the ms consultant who will setup hpc for rms. He confirmed that Intel C with MPI would be a better choice of compiler than just MS C.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;font-size:100%;"&gt;These Azure nodes are called “Virtual Server Role” and are virtual servers that can be RDPed into. Data can be transferred in a blob or you could host the database on site and use oData wcf services.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;font-size:100%;"&gt;I had a discussion about how Sql Azure could be used to process EDM databases. SQL Azure cannot attach mdf database files therefore it is unlikely that we will use this to process EDMs. SQL Azure has some different concepts to SQL Server. For example the idea is to have elastic provisioning of databases. No VMs, no servers, Pay-as-you-go business model and Zero Physical Administration, Linear scaling through database independence. Fan-out expensive computation. For more information goto &lt;/span&gt;&lt;a href="http://player.microsoftpdc.com/Session/1b08b109-c959-4470-961b-ebe8840eeb84"&gt;&lt;span style="font-family:Arial;font-size:100%;color:#800080;"&gt;http://player.microsoftpdc.com/Session/1b08b109-c959-4470-961b-ebe8840eeb84&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;font-size:100%;"&gt;In the key note there was a presentation called “Pixar's RenderMan using Microsoft Azure by Chris Ford” where Pixar demonstrated their software that they use for rendering their films. Previously they needed a lot of hardware to render the films. Azure allows scalability such that additional hardware can be added or removed within minutes&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;font-size:100%;"&gt;HPC and Azure have 2 different perspectives on scalability. The Azure team looks at scalability being the ability to expand horizontally in an unlimited manor. The HPC team see that certain algorithms especially MPI really require strong connectivity between the nodes. To achieve this a compromise has been made where new nodes can be small (1 core), medium (4 core) or large (8 core). The Azure team don’t seem to see the need for fast network connectivity between nodes which unfortunately really limits the scalability for algorithms that use MPI. The scenario of scaling compute is quite common, therefore we can expect some movement on this front&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;font-size:100%;"&gt;Microsoft offers to test your application on their datacenter. They can host up to 8 customers at a time and have access to the product teams if things need tweaking or products need new features.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:0;"&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;&lt;p&gt;&lt;span style="font-size:180%;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="ms-rteFontSize-4"&gt;&lt;span style="font-family:Arial;font-size:130%;"&gt;&lt;strong&gt;oData (Open Data Protocol)&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;oData is a layer that sits on top of EF. The idea is to produce a RESTfull web interface to the database thus making it open for all platforms. oData will include structures for relational data and a method for filtering data. According to Alex John it is not possible to expose Iqueryable functions through wcf. I need to double check this but Alex is the lead on the oData.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;For more information on OData click on:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;a href="http://player.microsoftpdc.com/Session/a32fdeb8-c878-4bf8-8d5c-6a56309b525c"&gt;&lt;span style="font-family:Arial;color:#800080;"&gt;http://player.microsoftpdc.com/Session/a32fdeb8-c878-4bf8-8d5c-6a56309b525c&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;a href="http://www.odata.org/blog"&gt;&lt;span style="font-family:Arial;"&gt;http://www.odata.org/blog&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;a href="http://odata.org/"&gt;&lt;span style="font-family:Arial;"&gt;http://odata.org&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;/div&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;The idea behind oData is to be able to embed a query within the URL in a RESTfull way. For example:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;&lt;a href="http://.../Items?$orderby=DateAdded&amp;amp;$top=10&amp;amp;$select"&gt;http://.../Items?$orderby=DateAdded&amp;amp;$top=10&amp;amp;$select&lt;/a&gt;=...&lt;/span&gt;&lt;/div&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;oAuth &lt;/span&gt;&lt;a href="http://oauth.net/"&gt;&lt;span style="font-family:Arial;"&gt;http://oauth.net&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;An open protocol to allow secure API authorization in a simple and standard method from desktop and web applications.”&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;Notes from other blogs &lt;/span&gt;&lt;a href="http://deanhume.com/Home/BlogPost/custom-odata-api-using-wcf-data-services/44"&gt;&lt;span style="font-family:Arial;"&gt;http://deanhume.com/Home/BlogPost/custom-odata-api-using-wcf-data-services/44&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:Arial;font-size:130%;"&gt;&lt;strong&gt;Entity Framework&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;I had lunch with the presenter of Code First with EF. This was interesting because we discussed the various methods of building applications. There was an agreement that building the database model first is a valid approach because of the life time of a datamodel exceeds that of an application. There will be some improvements made on the validation. There was a discussion if this should be made within the edm or the poco template. The idea behind the t4 template was that this would somehow make the interface to odata easier. Currently I do this with partial classes and an additional layer over EF. They said that this will improve soon. We also discussed the problems of updating the EDM after updating the database. There are some discussions around how this will improve soon. Soon there will be some additional features that add heuristics to the poco class generator. The idea is that you can set up patterns how to deal with table and field naming like tbl_tableName.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;For more information on Code First with EF goto&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;a href="http://player.microsoftpdc.com/Session/68cfa011-c399-4151-ad9f-748d8723a19d"&gt;&lt;span style="font-family:Arial;color:#800080;"&gt;http://player.microsoftpdc.com/Session/68cfa011-c399-4151-ad9f-748d8723a19d&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;Within the above presentation a demonstration of the use of DataAnnotations with EF was demonstrated. Here is a small extract of how this makes a POCO look like:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;public class User&lt;br /&gt;{&lt;br /&gt;public User()&lt;br /&gt;{&lt;br /&gt;Chirps = new List&amp;lt;Chirps&amp;gt;();&lt;br /&gt;}&lt;br /&gt;public int Id { get; set; }&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="ms-rteForeColor-2" id="ms-rterangepaste-start"&gt;&lt;/span&gt;&lt;span class="ms-rteForeColor-2"&gt;[StringLength(5, MinimumLength =3) ]&lt;/span&gt;&lt;br class="ms-rteForeColor-2"&gt;public string Name { get; set; }&lt;br /&gt;// public ICollection&amp;lt;Chirp&amp;gt; Users { get; set; }&lt;br /&gt;public virtuel ICollection&amp;lt;Chirp&amp;gt; Users { get; set; } // For lazy loading&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;public class Chirp&lt;br /&gt;{&lt;br /&gt;public int Id { get; set; }&lt;br /&gt;&lt;span class="ms-rteForeColor-2"&gt;[StringLength(255, MinimumLength = 1)]&lt;/span&gt;&lt;br class="ms-rteForeColor-2"&gt;public string Message { get; set; }&lt;br /&gt;public DatTime When { get; set; }&lt;br /&gt;public virtual User User { get; set; }&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;&lt;span class="ms-rteForeColor-2"&gt;[StoreIgnore]&lt;/span&gt;&lt;br class="ms-rteForeColor-2"&gt;public int ChirpActivity {&lt;br /&gt;get&lt;br /&gt;{&lt;br /&gt;return (from c in Chirps&lt;br /&gt;where c.When &amp;gt;DateTime.Now.addDay(1);&lt;br /&gt;select c).count();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;Feature Voting: &lt;/span&gt;&lt;a href="http://ef.mswish.net/"&gt;&lt;span style="font-family:Arial;"&gt;http://ef.mswish.net&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;&lt;br /&gt;Design blog: &lt;span lang="DE-CH"&gt;&lt;a href="http://blogs.msdn.com/efdesign/"&gt;http://blogs.msdn.com/efdesign/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span lang="DE-CH"&gt;&lt;span style="font-family:Arial;"&gt;Team blog: &lt;/span&gt;&lt;a href="http://blogs.msdn.com/adonet/"&gt;&lt;span style="font-family:Arial;"&gt;http://blogs.msdn.com/adonet/&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;Features (yet to come)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Enums&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Spatial&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Alternate keys&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;TVF support&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Migrations and deployment&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Performance &amp;amp; scalability &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Designer improvements&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;LINQ improvements&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span lang="DE-CH"&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-4"&gt;&lt;span style="font-family:Arial;font-size:130%;"&gt;&lt;strong&gt;Cloud Computing Workshop&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;I took part in a cloud computing workshop where participants shared their experiences in cloud computing. The main issues reported in this group where:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Not knowing exactly on which server and hard disk the data is located. Some auditors need to know this because of the attach that a technician can take data by just removing the hard disk&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Making sure that data stays within the country.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Configuration control: It is not acceptable to have the operating system update itself without proper testing (configuration management) This can be avoided by using virtual machines because the configuration of the machines is not maintained by Microsoft.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Support&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Unclear pricing model&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Brand name&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;Many startup companies use this because it means practically no infrastructure is needed to be maintained in house&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;Later in the workshops there was some concern about the unlimited cost model. In other words there is currently no way to limit the monthly price. There was some discussion in the workshop about how this could be achieved. My suggestion was to have a burn down chart but it is open as which criteria could be used to slow down the burn down rate. There was also some discussion of what criteria could be used to create new worker instances.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;Microsoft announced Visual Studio Team Foundation Server on Windows Azure&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;A trial can accessed from:&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;a href="http://backstock.cloadapp.net/Signup"&gt;&lt;span style="font-family:Arial;"&gt;http://backstock.cloadapp.net/Signup&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;Security can be handled using &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Windows Live ID&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Google&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Yahoo&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;CorporateID&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;Behind the scenes&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Job Agent as a Worker Role&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Team Build as a VM Role&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;SQL Azure for tabular data, stored procedures etc&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:symbol;"&gt;·&lt;span style="LINE-HEIGHT: normal; FONT-STYLE: normal"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Arial;"&gt;Blob storage for files and attachments&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;Microsoft also announced Windows Azure Marketplace formally known as Microsoft Codename “Dallas”. This includes a Data Market currently with 35 Content partners with 60 data offerings including ESRI etc. The idea is to easily discover and explore datasets&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;a class="ms-rteFontSize-3" href="https://datamarket.azure.com/"&gt;&lt;span style="font-family:Arial;"&gt;https://datamarket.azure.com&lt;/span&gt;&lt;/a&gt;&lt;span class="ms-rteFontSize-3" id="ms-rterangepaste-start"&gt;&lt;/span&gt; &lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="ms-rteFontSize-3" id="ms-rterangepaste-end"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;span style="font-family:Arial;"&gt;For more information on Building, Deploying and Managing Windows Azure Applications&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="ms-rteFontSize-3"&gt;&lt;a href="http://player.microsoftpdc.com/Session/19c4c834-3cae-408c-96f0-e87bfad92cff"&gt;&lt;span style="font-family:Arial;color:#800080;"&gt;http://player.microsoftpdc.com/Session/19c4c834-3cae-408c-96f0-e87bfad92cff&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-2400593081140864373?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/2400593081140864373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/2400593081140864373'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2010/11/notes-from-pdc2010.html' title='Notes from PDC2010'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-8511233670262288488</id><published>2010-11-03T07:25:00.001-07:00</published><updated>2010-11-03T07:25:00.528-07:00</updated><title type='text'>An example of paired programing in making a deployment utility</title><content type='html'>&lt;p&gt;When I wrote this I was sitting in an airplane on my way to the PDC and I cannot sleep. So it is time to write on my blog. Last week in Paris I had a great experience doing paired programming. Here is what we did.&lt;/p&gt;  &lt;p&gt;We started off from some Use cases that described things that we want to automate when we make our deployment of the modeling platform. For example:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Asynchronous update of storm foot print files &lt;/li&gt;    &lt;li&gt;Synchronous build of server &lt;/li&gt;    &lt;li&gt;Synchronous deleting of databases &lt;/li&gt;    &lt;li&gt;Etc &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Based on these Use Cases we set to work on the sequence diagrams of what we want the deployment tool to do. We came to the notion of a task that would have inputs, results and an execute method. Then we came to the notion of an asynchronous task that would inherit from the task and would have the additional property of a list of targets. We then started to think about the components that would make up the system. Keeping simplicity in mind, or in other words to treat simplicity as a feature we decided that the deployment mechanism should not be distributed unless we find no alternative. So we came up with a TaskDispatcher that would process a series of tasks and a scheduler that could do higher level operations like schedule tasks to run.&lt;/p&gt;  &lt;p&gt;So with this ground work we set about building the interfaces that would be needed as input to the tasks and we came up with:&lt;/p&gt;  &lt;p&gt;namespace PartnerRe.Deployment.Contracts    &lt;br /&gt;{&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public interface IParameters     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string Description { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string SourcePath { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string DestinationPath { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; bool FailOnFirstError { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TimeSpan TaskTimeOut { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;We compared this interface with the list of Use cases and found that with some interpretation from the custom task implementations this would be sufficient for inputs required by the Tasks.&lt;/p&gt;  &lt;p&gt;Next we looked at the outputs and came up with:&lt;/p&gt;  &lt;p&gt;namespace PartnerRe.Deployment.Contracts    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public interface IExecutionResults     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; bool Success { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string Message { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string LogFilePath { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;Again we considered each use case in turn and came to the conclusion that this would be enough. &lt;/p&gt;  &lt;p&gt;Next we thought about how to setup the task structures. We decided to use abstract classes for the Tasks, in this way we have a class structure that is easier to extend. Starting with the Synchonous TaskBase we came up with:&lt;/p&gt;  &lt;p&gt;namespace PartnerRe.Deployment.Contracts    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public abstract class TaskBase : PartnerRe.Deployment.Contracts.ITaskBase     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public TaskEnumeration Task = TaskEnumeration.None;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public TaskType TaskType = TaskType.Synchronous;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public IParameters Parameters;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public IExecutionResults ExecutionResults;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public abstract void TaskOperation();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void Execute()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; StartTime = DateTime.Now;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TaskOperation();     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EndTime = DateTime.Now;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public DateTime StartTime { get; private set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public DateTime EndTime { get; private set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;The implementation of the ITaskBase interface is a little overkill. We decided we need something to describe where the task is synchronous or asynchronous as well as an enumeration to identify what the task is. The Execute function implements a template method pattern where the programmer must implement the TaskOperation Method. &lt;/p&gt;  &lt;p&gt;The Asynchonous task looks like:&lt;/p&gt;  &lt;p&gt;namespace PartnerRe.Deployment.Contracts    &lt;br /&gt;{     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public abstract class AsynchronousTaskBase : TaskBase     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public IList&amp;lt;string&amp;gt; Targets;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public string CurrentTarget { get; set; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public AsynchronousTaskBase()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : base()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.TaskType = Contracts.TaskType.Asynchrounous;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;Notice we have the additional list of targets and CurrentTarget properties. We thought for a while over whether we would rather implement a list of tasks. We decided that the above was simpler because all we are interested in is a list of results and not a list of tasks that also include the Input parameters and Execution methods. Our idea is to setup one task with place holders for the list of targets &lt;/p&gt;  &lt;p&gt;Next we want to implement the Task dispatcher and we came up with the following&lt;/p&gt;  &lt;p&gt;using System;    &lt;br /&gt;using System.Collections.Generic;     &lt;br /&gt;using System.Linq;     &lt;br /&gt;using System.Text;     &lt;br /&gt;using PartnerRe.Deployment.Contracts;     &lt;br /&gt;using System.Threading.Tasks;     &lt;br /&gt;using System.Threading;&lt;/p&gt;  &lt;p&gt;namespace PartnerRe.Deployment    &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160; public class TaskDispatcher     &lt;br /&gt;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private List&amp;lt;object&amp;gt; taskDaisyChain;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private List&amp;lt;object&amp;gt; targets;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public TaskDispatcher()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; taskDaisyChain = new List&amp;lt;object&amp;gt;;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void AddTask&amp;lt;T&amp;gt;(T task)    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;{   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.taskDaisyChain.Add(task);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void ExecuteTasks()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (int i = 0; i &amp;lt; taskDaisyChain.Count; i++)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TaskBase currentTask = this.taskDaisyChain[i] as TaskBase; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //object task = this.TaskDaisyChain[i];   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (currentTask.TaskType == TaskType.Synchronous)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; currentTask.Execute();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (currentTask.TaskType == TaskType.Asynchrounous)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (targets == null)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new ArgumentException(&amp;quot;Asynchronous tasks needs a list of targets to run on&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (targets.Count == 0)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new ArgumentException(&amp;quot;Asynchronous tasks needs a list of targets to run on&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AsynchronousTaskBase taskAsynchronous = this.taskDaisyChain[i] as AsynchronousTaskBase;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; taskAsynchronous.Targets = targets; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; IExecutionResults[] executionResults = new IExecutionResults[targets.Count]; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Parallel.For(0, targets.Count, x =&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TaskFactory taskFactory = new TaskFactory();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AsynchronousTaskBase taskParallel = taskFactory.CreateTask(taskAsynchronous.Task) as AsynchronousTaskBase;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; taskParallel.Parameters = taskAsynchronous.Parameters;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; taskParallel.CurrentTarget = taskAsynchronous.Targets[x];    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; taskParallel.Targets = taskAsynchronous.Targets;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; taskParallel.Execute();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lock (executionResults)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; executionResults[x] = taskParallel.ExecutionResults;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; taskAsynchronous.ExecutionResults.Message = &amp;quot;&amp;quot;;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; taskAsynchronous.ExecutionResults.Success = true;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (int j = 0; j &amp;lt; targets.Count; j++)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; taskAsynchronous.ExecutionResults.Message += executionResults[j].Message;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (!executionResults[j].Success)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; taskAsynchronous.ExecutionResults.Success = false;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public void AddListOfTargets(List&amp;lt;string&amp;gt; Targets)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.targets = Targets;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;We decided that we would need a queue of tasks implement above as a daisy chain. There is some scope for refactoring for example we have implemented another list of targets here. But the design principles are sound. Also probably the lock in the parallel for is over kill but it is a shared variable and in this case the time to execute the tasks are far greater than the time lost in locking the results. The syntax around the parallel for was a little different, we did not find many examples for to implement an itterator.&lt;/p&gt;  &lt;p&gt;We implemented a one way file synchronization task that looks like:&lt;/p&gt;  &lt;p&gt;using System;   &lt;br /&gt;using System.Collections.Generic;    &lt;br /&gt;using System.Linq;    &lt;br /&gt;using System.Text;    &lt;br /&gt;using PartnerRe.Deployment.Contracts;    &lt;br /&gt;using System.IO;    &lt;br /&gt;using System.Diagnostics;    &lt;br /&gt;using System.ComponentModel;    &lt;br /&gt;using System.ComponentModel.Composition; &lt;/p&gt;  &lt;p&gt;namespace PartnerRe.Deployment   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [Export(typeof(TaskBase))]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class SynchronizeDirectoryTask : AsynchronousTaskBase    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private string WorkingDirectory = &amp;quot;C:\\Program Files\\Windows Resource Kits\\Tools&amp;quot;; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public SynchronizeDirectoryTask() : base()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Task = TaskEnumeration.SynchronizeDirectory;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Parameters = new Parameters();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.ExecutionResults = new ExecutionResults();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public override void TaskOperation()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (this.Task == TaskEnumeration.None)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new Exception(&amp;quot;The programmer forgot to set the Task enumeration in the Task constructor&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;//… Lots more tests with ArgumentExceptions&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //C:\Program Files\Windows Resource Kits\Tools\Robocopy.exe   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; // robocopy Source Destination *.* /XO &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Parameters.DestinationPath = this.Parameters.DestinationPath.Replace(&amp;quot;&amp;lt;SERVER&amp;gt;&amp;quot;, this.CurrentTarget); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ProcessStartInfo pCopy = new ProcessStartInfo();   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pCopy.WorkingDirectory = WorkingDirectory;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pCopy.FileName = &amp;quot;Robocopy.exe&amp;quot;;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pCopy.UseShellExecute = false;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pCopy.RedirectStandardOutput = true;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pCopy.RedirectStandardError = true;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pCopy.Arguments = this.Parameters.SourcePath + &amp;quot; &amp;quot;+this.Parameters.DestinationPath+&amp;quot; *.* /XO&amp;quot;;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Process proc = Process.Start(pCopy); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string output = proc.StandardOutput.ReadToEnd();   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc.WaitForExit(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; string error = proc.StandardError.ReadToEnd();   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; proc.WaitForExit(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.ExecutionResults.Message = output;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.ExecutionResults.LogFilePath = &amp;quot;\\\\&amp;quot; + this.CurrentTarget + &amp;quot;\\c$\\MyLog&amp;quot;;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.ExecutionResults.Success = true; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;Here we wanted to program as little as possible, so we took Robocopy and redirected the standard output. We also implemented a MEF Export. The corresponding object factory looks like:&lt;/p&gt;  &lt;p&gt;using System;   &lt;br /&gt;using System.Collections.Generic;    &lt;br /&gt;using System.Linq;    &lt;br /&gt;using System.Text;    &lt;br /&gt;using PartnerRe.Deployment.Contracts;    &lt;br /&gt;using System.ComponentModel;    &lt;br /&gt;using System.ComponentModel.Composition;    &lt;br /&gt;using System.ComponentModel.Composition.Hosting; &lt;/p&gt;  &lt;p&gt;namespace PartnerRe.Deployment   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public class TaskFactory    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public TaskFactory()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DirectoryCatalog directoryCatalog = new DirectoryCatalog(@&amp;quot;.&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CompositionBatch batch = new CompositionBatch();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; batch.AddPart(this);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CompositionContainer container = new CompositionContainer(directoryCatalog);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; container.Compose(batch);     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [ImportMany(typeof(TaskBase))]   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private IEnumerable&amp;lt;TaskBase&amp;gt; Tasks;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public TaskBase CreateTask(TaskEnumeration TaskType)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; foreach(TaskBase t in Tasks)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (t.Task == TaskType)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch (t.TaskType)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case Contracts.TaskType.Asynchrounous:    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return t as AsynchronousTaskBase;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case Contracts.TaskType.Synchronous:    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return t as TaskBase;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; throw new Exception(&amp;quot;This task has not yet been implemented in the TaskFactory&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;The idea is that when we add new tasks we want them to be imported automatically into our application with the least amount of manual programming as possible. In this case we only need to add to the TaskEnumeration each time we add a new task.&lt;/p&gt;  &lt;p&gt;We developed using Test Driven Development, this was used as a way to design the API. In the end our test looked like: &lt;/p&gt;  &lt;p&gt;[TestMethod]   &lt;br /&gt;public void SynchronizeDirectory_UnsynchronizedFiles_TargetFilesSyncronized()    &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; // Arrange &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; DestinationDir = &amp;quot;\\\\&amp;lt;SERVER&amp;gt;\\D$\\SOURCE\\PartnerRe.Deployment\\TestFiles\\Source&amp;quot;; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; TaskDispatcher taskDispatcher = new TaskDispatcher();   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; SynchronizeDirectoryTask synchronizeDirectoryTask = new SynchronizeDirectoryTask();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; synchronizeDirectoryTask.Parameters.DestinationPath = DestinationDir;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; synchronizeDirectoryTask.Parameters.SourcePath = SourceDir; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; taskDispatcher.AddTask&amp;lt;TaskBase&amp;gt;(synchronizeDirectoryTask);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;string&amp;gt; Targets = new List&amp;lt;string&amp;gt;();&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Targets.Add(&amp;quot;CHZUPRELR886W9X&amp;quot;);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //Targets.Add(&amp;quot;Server2&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; taskDispatcher.AddListOfTargets(Targets); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; // Act   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; taskDispatcher.ExecuteTasks(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; //// Assert   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Assert.IsTrue(synchronizeDirectoryTask.ExecutionResults.Success); &lt;/p&gt;  &lt;p&gt;} &lt;/p&gt; As can be seen the test is not complete, but the method is sound.  &lt;p&gt;In this case the experience I made with Paired programming showed it is an efficient method of programming. It has the advantage that it integrates at least 2 people directly into the decision making process of building and refactoring an architecture while sharing knowledge. The only time that I found paired programming not to be appropriate is when the programming method is unclear, for example when intensive googling is needed to resolve a small detail.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-8511233670262288488?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/8511233670262288488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/8511233670262288488'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2010/11/example-of-paired-programing-in-making.html' title='An example of paired programing in making a deployment utility'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-826122433838093786</id><published>2010-09-22T12:03:00.001-07:00</published><updated>2010-09-22T12:03:17.762-07:00</updated><title type='text'>Making SQL Queries statement act on the same database across multiple servers</title><content type='html'>&lt;p&gt;Here’s a useful way to apply queries across a number of sql 2008 servers&lt;/p&gt;  &lt;p&gt;1. Open Microsoft SQL Server Management Studio   &lt;br /&gt;2. Under Database Engine select Central Management Servers    &lt;br /&gt;&amp;#160;&amp;#160; (It is on the tab &amp;quot;Registered Servers&amp;quot; next to the tab &amp;quot;Object Explorer&amp;quot;    &lt;br /&gt;3. Right Mouse click &amp;quot;Central Management Servers&amp;quot; and select Register Central Management Server...    &lt;br /&gt;4. Choose the Server that you want to add in the &amp;quot;New Server Registration dialog&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160; This has the effect of adding a node directly under &amp;quot;Central Management Server&amp;quot;. This is used to host the Server groups    &lt;br /&gt;5. Right Mouse click on the new node and select &amp;quot;New Server Group...&amp;quot;    &lt;br /&gt;6. Give a group name    &lt;br /&gt;7. Right mouse click on the new group and select &amp;quot;New Server Registration...&amp;quot;    &lt;br /&gt;8. Select the servers that you want to be part of the group &lt;/p&gt;  &lt;p&gt;This completes the setup. &lt;/p&gt;  &lt;p&gt;To create queries that act across the registered servers    &lt;br /&gt;1. Right mouse click on a server group    &lt;br /&gt;2. &amp;quot;New Query&amp;quot; &lt;/p&gt;  &lt;p&gt;When you execute the query you will receive the results with an additional &amp;quot;Server Name&amp;quot; column giving the result of that query on that server&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-826122433838093786?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/826122433838093786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/826122433838093786'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2010/09/making-sql-queries-statement-act-on.html' title='Making SQL Queries statement act on the same database across multiple servers'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-6382713281496624530</id><published>2010-09-22T11:59:00.001-07:00</published><updated>2010-09-22T11:59:41.176-07:00</updated><title type='text'>Setting up Transaction log shipping</title><content type='html'>&lt;p&gt;We have a high performance physical sql server that we want to backup via netApp shares. To get this to work we setup a second virtual sql server that uses netapp shares which are backup using the Snap manager tool. &lt;/p&gt;  &lt;p&gt;Data is sent to the virtual sql server using Transaction log shipping. Here is how to setup transaction log shipping &lt;/p&gt;  &lt;p&gt;1. Create a Backup of the database making shure that:   &lt;br /&gt;&amp;#160;&amp;#160; - Recovery model = Full    &lt;br /&gt;&amp;#160;&amp;#160; - Backup type = Full    &lt;br /&gt;2. Restore this backup onto the virtual sql server choosing the second option:    &lt;br /&gt;&amp;#160;&amp;#160; - Leave the database non-operational, and do not roll back transactions. Additional transaction logs can be restored (RESTORE WITH NORECOVERY)    &lt;br /&gt;3. After the backup is complete there is a green upward pointing arrow on the database on the virtual server and the database has (restoring..) after it.    &lt;br /&gt;4. Goto the physical server, right mouse click the database and select properties    &lt;br /&gt;5. In the select page choose &amp;quot;Transaction Log Shipping&amp;quot;    &lt;br /&gt;6. tick the check box &amp;quot;Enable this as primary database in a log shipping configuration&amp;quot;    &lt;br /&gt;7. Click the button Backup Settings    &lt;br /&gt;&amp;#160;&amp;#160; This will open &amp;quot;Transaction Log Backup Settings&amp;quot; dialog    &lt;br /&gt;8. In the Network path to backup folder give the path on the physical server where the tranaction logs are to be found eg    &lt;br /&gt;&amp;#160;&amp;#160; \\Myserver\LOGSHIPPING$    &lt;br /&gt;&amp;#160;&amp;#160; In the field &amp;quot;If the backup folder is located on the primary server, type the path to the folder&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160; G:\LOGSHIPPING    &lt;br /&gt;&amp;#160;&amp;#160; OK    &lt;br /&gt;9. In the Secondary server instances and databases press the Add button    &lt;br /&gt;10. Press the connect button and select the secondary database    &lt;br /&gt;11. In &amp;quot;Destination folder for copied files&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; G:\LOGSHIPPING    &lt;br /&gt;12. OK    &lt;br /&gt;13. Check that the backup and restore jobs created on both servers run successfully &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7865085071528870006-6382713281496624530?l=nigelfindlater.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/6382713281496624530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7865085071528870006/posts/default/6382713281496624530'/><link rel='alternate' type='text/html' href='http://nigelfindlater.blogspot.com/2010/09/setting-up-transaction-log-shipping.html' title='Setting up Transaction log shipping'/><author><name>Nigel Findlater</name><uri>http://www.blogger.com/profile/14166383703471703148</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-7865085071528870006.post-9047219017974828044</id><published>2010-06-11T11:39:00.001-07:00</published><updated>2010-06-11T11:39:40.444-07:00</updated><title type='text'>Some refactoring using E4 POCO with generics</title><content type='html'>&lt;p&gt;Here is a story around refactoring some switch statements using polymorphism and some repetitive code using some generics to produce DRY code. &lt;/p&gt;  &lt;p&gt;We has a smell in our EarthquakeSettingsLegacy class that had a switch statements that needs some refactoring to use a polymorphic approach &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160; private void GetVulnerability(ModelRun modelRun)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ModelType modelType;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; modelType = (ModelType)modelRun.ModelId; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;Ccp.Entities.VulnerabilityAggregate&amp;gt; vulnerabilityAggregates = databaseContext   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Query&amp;lt;VulnerabilityAggregate&amp;gt;()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Where(v =&amp;gt; v.ModelRunId.HasValue &amp;amp;&amp;amp; v.ModelRunId.Value.Equals(modelRun.Id)).ToList(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; switch (modelType)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case ModelType.EarthquakeCanada:    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GetCanadaVulnerability(modelRun, vulnerabilityAggregates); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case ModelType.EarthquakeMexico:    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GetMexicoVulnerability(modelRun, vulnerabilityAggregates);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case ModelType.EarthquakeAfricaIndia:   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GetAfricaToIndiaVulnerability(modelRun, vulnerabilityAggregates);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case ModelType.EarthquakeJapan:   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GetJapanVulnerability(modelRun, vulnerabilityAggregates);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; case ModelType.EarthquakeSouthAmerica:   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; GetSouthAmericaVulnerability(modelRun, vulnerabilityAggregates);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; break; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; default:   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;The first step was to make the following more generic. The challenge is that we are using auto generate POCO classes, in other words we cannot simply make the classes inherit from a base class that we could use as a compile time type with generics. Another complication was that we need to use a compile time type as apposed to a run time type. Because Generics are place holders for types that are compiled at compile time. &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; private void GetSouthAmericaVulnerability(ModelRun modelRun, List&amp;lt;Ccp.Entities.VulnerabilityAggregate&amp;gt; vulnerabilityAggregates)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;Ccp.Entities.Earthquake.SouthAmericaVulnerabilityCatalogue&amp;gt; vaList = vulnerabilityAggregates    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Select&amp;lt;Ccp.Entities.VulnerabilityAggregate, Ccp.Entities.Earthquake.SouthAmericaVulnerabilityCatalogue&amp;gt;(    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; va =&amp;gt; EntityMapper.Map&amp;lt;Ccp.Entities.VulnerabilityAggregate, Ccp.Entities.Earthquake.SouthAmericaVulnerabilityCatalogue&amp;gt;(va))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .ToList(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //Earthquake handles vulnerability functions as strings where as Tropical Cyclone handles them as integers. Therefore we need to   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; //have some special code to map these together &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var result = from av in this.databaseContext.GetAll&amp;lt;VulnerabilityAggregate&amp;gt;().Where(z =&amp;gt; z.ModelRunId.Value.Equals(modelRun.Id))   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; join vf in this.databaseContext.GetAll&amp;lt;VulnerabilityFunction&amp;gt;()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; on av.VulnerabilityFunctionId equals vf.Id    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select new { av.VulnerabilityFunctionId, vf.VulnerabilityFunctionString }; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; var dic = result.Select(p =&amp;gt; new { p.VulnerabilityFunctionId, p.VulnerabilityFunctionString })   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .Distinct()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .AsEnumerable()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; .ToDictionary(k =&amp;gt; k.VulnerabilityFunctionId, v =&amp;gt; v.VulnerabilityFunctionString); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; for (int i = 0; i &amp;lt; vulnerabilityAggregates.Count; i++)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; String Vulnerability;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int? VulnerabilityFunctionId = vulnerabilityAggregates[i].VulnerabilityFunctionId;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (dic.TryGetValue(VulnerabilityFunctionId.Value, out Vulnerability))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; List&amp;lt;string&amp;gt; vulnerabilityCoeficients;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vulnerabilityCoeficients = Vulnerability.Split(' ').ToList&amp;lt;string&amp;gt;(); &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vaList[i].A = Convert.ToDouble(vulnerabilityCoeficients[0]);   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vaList[i].B = Convert.ToDouble(vulnerabilityCoeficients[1]);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vaList[i].C = Convert.ToDouble(vulnerabilityCoeficients[2]);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; vaList[i].VulnerabilityFunction = Vulnerability;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (vulnerabilityAggregates.Count &amp;gt; 0)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; using (this.databaseContextEarthquake.BeginTransaction())    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.databaseContextEarthquake.DeleteAll&amp;lt;Ccp.Entities.Earthquake.SouthAmericaVulnerabilityCatalogue&amp;gt;();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160
