Upcoming courses:

  • Aarhus, Denmark, March 5 - 9, 2012
  • New York City, USA, March 26 - 30, 2012
Read more on our website

About me

Brian Holmgård Kristensen

Hi, I'm Brian. I'm a Danish guy primarily working with ASP.NET e-commerce solutions using Microsoft Commerce Server.

I'm co-founder and core-member of Aarhus .NET Usergroup (ANUG), which is a offline community for .NET developers in Denmark.

You can visit my View Brian Holmgård Kristensen's profile on LinkedIn or follow me on Twitter @brianh_dk. Also please feel free to contact me via e-mail Send me an e-mail.


On this page

Only one OrderForm in Commerce Server 2009
Commerce Server training videos
How to retrieve Category Rank in Commerce Server 2009
Midway impressions on Tech-Ed North America 2009
Installation af Umbraco - step 2
En aften i F#-tegnet
Installation af Umbraco - step 1
Opsætning og installation af prerequisites til Umbraco
Første spadestik med Umbraco...
Nu som deltager i dansk udvikler konkurrence



The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

RSS 2.0

Send mail to the author(s) E-mail

Total Posts: 36
This Year: 0
This Month: 0
This Week: 0
Comments: 10

Sign In

Follow me on Twitter @brianh_dk
 Monday, 06 September 2010

There is a built-in restriction in the new Commerce Server 2009 Foundation API (MCCF - Multi Channel Commerce Foundation) to only expect one OrderForm instance on the aggregate root, being the OrderGroup. An OrderGroup is either a Basket or PurchaseOrder (or OrderTemplate if you are using that).

Below is a simplified diagram of the key classes in the Object Model for the Orders System. Please notice that we have the OrderForms collection on the OrderGroup class, where each instance of an OrderForm can be retrieved either by index or by a name (string).

Orders API - class hierachy

This allows us to create multiple OrderForms, each with their own data like Line Items, Payments, Shipments etc, and share other data like Addresses, TrackingNumber and a few more properties on the OrderGroup class.

In all projects I’ve been working on we don’t actually use the ability to have multiple OrderForms. We only have one single OrderForm at all times.

The Commerce Server 2007 code would then look something like:

   1:  Basket basket = OrderContext.Current.GetBasket(userId, basketName);
   3:  if (basket.OrderForms.Count == 0)
   4:      basket.OrderForms.Add(new OrderForm());


This retrieves a named Basket from the Orders System and if the basket is new, it will create an instance of OrderForm and add this to the OrderForms collection.

   1:  basket.OrderForms[0].LineItems.Add(
   2:      new LineItem("ProductCatalog", "ProductID", "VariantID", 1m));


At some point we would then like to add a Line Item to our basket as illustrated above where we hardcode the index-value to 0 to retrieve the one and only OrderForm we have.

In Commerce Server 2009 though, we never deal with the actual types, instead we work with the ICommerceEntity type. The Commerce Server 2009 code for retrieving a basket would be something like:

   1:  var query = new CommerceQuery<CommerceEntity>("Basket");
   3:  query.SearchCriteria.Model.SetPropertyValue("UserId", userId);
   4:  query.SearchCriteria.Model.SetPropertyValue("BasketType", 0); // 0 = Basket, 1 = Purchase Order
   5:  query.SearchCriteria.Model.SetPropertyValue("Name", basketName);
   7:  var operationServiceAgent = new OperationServiceAgent();
   9:  var response =
  10:      operationServiceAgent
  11:          .ProcessRequest(
  12:              new CommerceRequestContext
  13:              {
  14:                  Channel = "DefaultChannel",
  15:                  UserId = Guid.NewGuid().ToString("b"),
  16:                  UserLocale = CultureInfo.CurrentCulture.ToString(),
  17:                  UserUILocale = CultureInfo.CurrentUICulture.ToString(),
  18:                  RequestId = Guid.NewGuid().ToString()
  19:              }, 
  20:              query.ToRequest())
  21:          .OperationResponses
  22:          .Single() as CommerceQueryOperationResponse;
  24:  var basketEntity = response.CommerceEntities.Single();


Effectively this will execute the CommerceQueryOperation_Basket Operation Sequence defined in ChannelConfiguration.config which in short will load the Basket from the Orders System and map this to the generic ICommerceEntity type.

In the process of retrieving and mapping a Basket to a ICommerceEntity the following extension method from Microsoft.Commerce.Providers.Utility.OrderGroupExtensions is being called on the OrderGroup:

   1:  public static void EnsureDefaultOrderForm(this OrderGroup orderGroup, string modelName)
   2:  {
   3:      ParameterChecker.CheckForNull(orderGroup, "orderGroup");
   4:      if (orderGroup.OrderForms["Default"] == null)
   5:      {
   6:          if (string.IsNullOrEmpty(modelName))
   7:          {
   8:              modelName = "Basket";
   9:          }
  10:          OrderForm orderForm = CommerceServerClassFactory.CreateInstance<OrderForm>(modelName, 2, new object[] { "Default" });
  11:          orderGroup.OrderForms.Add(orderForm);
  12:      }
  13:  }

This method is responsible of making sure that a single OrderForm with the name “Default” is always available in the OrderForms collection of the OrderGroup instance.

Also there is an extension method to always retrieve this single OrderForm called Microsoft.Commerce.Providers.Utility.OrderGroupExtensions.GetDefaultOrderForm.

   1:  public static OrderForm GetDefaultOrderForm(this OrderGroup orderGroup, string modelName)
   2:  {
   3:      ParameterChecker.CheckForNull(orderGroup, "orderGroup");
   4:      if (orderGroup.OrderForms["Default"] == null)
   5:      {
   6:          if (string.IsNullOrEmpty(modelName))
   7:          {
   8:              modelName = "Basket";
   9:          }
  10:          OrderForm orderForm = CommerceServerClassFactory.CreateInstance<OrderForm>(modelName, 2, new object[] { "Default" });
  11:          orderGroup.OrderForms.Add(orderForm);
  12:      }
  13:      return orderGroup.OrderForms["Default"];
  14:  }

This method is used throughout the many Operation Sequence Components in the Foundation API and if you are developing your own custom Operation Sequence Components that works on the Orders System this method is properly something you would like to use.

As mentioned earlier we’ve just been using one OrderForm in all our Commerce Server projects, so this new limitation is not a problem for us, but on one of my Commerce Server Training courses I had a guy telling me that they where actually using multiple OrderForms on a CS 2007 project, so this new limitation would be a problem for them if they were to upgrade or create a similar solution on a new CS 2009 project.

What if we need more than OrderForm on our project, what to do?

In short: rethink. A solution with multiple OrderForms in CS 2009 will be too difficult to implement because of the many dependencies in the standard Operation Sequence Components that expecting there to be only one – remember they are all calling the GetDefaultOrderForm() extension method. Consider using multiple OrderGroups instead.


If you are reading this and have come up with a better solution to having multiple OrderForms in CS 2009 or have any comments at all I would really appreciate hearing from you :-)

Posted on Monday, 06 September 2010 07:54:00 (Romance Standard Time, UTC+01:00)
# | Comments [0]
 Friday, 03 September 2010

Max Akbar’s Commerce Server 2007 training videos have yet again become available for purchase. More than 19 hours of material can now be found on

We are working on producing and releasing new training videos targeting Commerce Server 2009.

Posted on Friday, 03 September 2010 13:27:37 (Romance Standard Time, UTC+01:00)
# | Comments [0]
 Tuesday, 27 April 2010

In Commerce Server the Rank property is used as a sorting discriminator when retrieving categories, products and variants. This property is usually managed using Catalog Manager as shown in the screenshot below:


The Rank property could also be managed in your own application which will be the topic of a later blog-post. This blog-post will focus on how to get the actual Rank value when retrieving categories in Commerce Server.

How did we do this in in Commerce Server 2007?

Pretty easy! We just include “Rank” as an item in the PropertiesToReturnArray for child categories (line 12) when requesting a specific category and later retrieve the value from the property-bag of the Category instance (line 24) as shown in the example below:

   1:  public void RequestUsing2007(string catalogName, string categoryName)
   2:  {
   3:      var catalogSystem = CommerceContext.Current.CatalogSystem;
   5:      var configuration = new CategoryConfiguration
   6:      {
   7:          LoadChildCategories = true,
   8:          ChildCategories =
   9:          {
  10:              SearchOptions =
  11:              {
  12:                  PropertiesToReturnArray = new[] { "DisplayName", "Rank" }
  13:              }
  14:          }
  15:      };
  17:      var category =
  18:          catalogSystem.GetCategory(catalogName, categoryName, "da-DK", configuration);
  20:      foreach (var childCategory in category.ChildCategories)
  21:      {
  22:          _writer.WriteLine("Id={0}", childCategory.Name);
  23:          _writer.WriteLine("DisplayName={0}", childCategory.DisplayName);
  24:          _writer.WriteLine("Rank={0}", childCategory["rank"]);
  26:          _writer.WriteLine();
  27:      }
  28:  }

And how can I do it in Commerce Server 2009?

In Commerce Server 2009 with the new Foundation API the overall way of retrieving entities in Commerce Server has changed a lot. In the example below I’ve added “Rank” as part of the properties to retrieve when requesting child categories for a specific category (line 10):

   1:  public void RequestUsing2009(string catalogName, string categoryName)
   2:  {
   3:      var categoryQuery = new CommerceQuery<CommerceEntity>("Category");
   4:      categoryQuery.Model.Properties.Add(new[] { "Id", "DisplayName" });
   6:      categoryQuery.SearchCriteria.Model.SetPropertyValue("CatalogId", catalogName);
   7:      categoryQuery.SearchCriteria.Model.SetPropertyValue("Id", categoryName);
   9:      var childCategoryQuery = new CommerceQueryRelatedItem<CommerceEntity>("ChildCategories", "Category");
  10:      childCategoryQuery.Model.Properties.Add(new[] { "Id", "DisplayName", "Rank" });
  11:      categoryQuery.RelatedOperations.Add(childCategoryQuery);
  13:      var operationServiceAgent = new OperationServiceAgent();
  15:      var response = 
  16:          operationServiceAgent.ProcessRequest(
  17:              new CommerceRequestContext
  18:              {
  19:                  Channel = "MyChannel",
  20:                  UserLocale = "da-DK",
  21:                  UserUILocale = "da-DK",
  22:                  RequestId = Guid.NewGuid().ToString()
  23:              }, 
  24:              categoryQuery.ToRequest());
  26:      var operationResponse = (CommerceQueryOperationResponse)response.OperationResponses.Single();
  28:      var entity = operationResponse.CommerceEntities.SingleOrDefault();
  30:      foreach (var childCategory in entity.Properties["ChildCategories"] as CommerceRelationshipList)
  31:      {
  32:          foreach (var categoryProperty in childCategory.Target.Properties)
  33:          {
  34:              _writer.WriteLine
  35:                  ("{0}={1} ({2})", 
  36:                  categoryProperty.Key, 
  37:                  categoryProperty.Value, 
  38:                  categoryProperty.Value.GetType().Name);
  39:          }
  41:          _writer.WriteLine();
  42:      }
  43:  }


One of the Operation Sequence components being executed in this operation is responsible for creating the CategoryConfiguration instance, that we manually created in the Commerce Server 2007 example (CS 2007 example line 5). This Operation Sequence component is named “CategoryConfiguration_Prepare”.

The actual logic for building the CategoryConfiguration instance is implemented in a class named CatalogConfigurationBuilder. This class will look in the MetadataDefinitions.xml file to match up the properties requested by the developer (in our case “Id, DisplayName, Rank”) with the properties registered for the actual entity being requested (“Category”).

If Rank is not registred in the MetadataDefinitions.xml file, it will be ignored by the CatalogConfigurationBuilder (method doing this is called TranslatePropertyName) and will therefore not be part of the “PropertiesToReturnArray” that in the end decides which columns to retrieve from the catalog table in SQL Server.

To make sure that Rank is registred in MetadataDefinitions.xml verify it by follow these steps:

  1. Open MetadataDefinitions.xml
  2. Locate <CommerceEntity name=”Category”>
  3. Make sure that there is a <PropertyMapping> element for property=”Rank” (<PropertyMapping property=”Rank” csProperty=”rank” />)
  4. Make sure that there is a <Property> element for name=”Rank” (<Property name=”Rank” dataType=”String” />)

Step 3 explained:

   1:  <EntityMappings>
   2:    <EntityMapping
   3:          csType="Microsoft.CommerceServer.Catalog.Category"
   4:          csAssembly="Microsoft.CommerceServer.Catalog, Version=, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
   6:      <PropertyMappings>
   7:        <!-- 
   8:              The following mappings are required here to ensure that all
   9:              the product common properties are represented in the Microsoft Multi-Channel Commerce Foundation 
  10:              metadata. These are not returned by the Commerce Server
  11:              metadata automatically as the common properties.
  12:              -->
  13:        <PropertyMapping property="BaseCatalogName" csProperty="BaseCatalogName" />
  14:        <PropertyMapping property="Rank" csProperty="rank" />


Step 4 explained:

   1:  <Properties>
   2:    <!-- 
   3:      The following property definitions are required here to ensure that all
   4:      the product common properties are represented in the 
   5:      metadata. These are not returned by the Commerce Server
   6:      metadata automatically as the common properties.
   7:      -->
   8:    <Property name="BaseCatalogName"        dataType="String" >
   9:      <DisplayName value="Base Catalog Name"/>
  10:    </Property>
  11:    <Property name="Rank" dataType="String" />


That’s it! The response returned by the Foundation API should now have the actual Rank value returned for each child category entity:

Id=ThirdRankingCategory (String)
Rank=1 (Int32)
DisplayName=ThirdRankingCategory (String)

Id=AnotherRankingCategory (String)
Rank=2 (Int32)
DisplayName=AnotherRankingCategory (String)

Id=SomeRankingCategory (String)
Rank=3 (Int32)
DisplayName=SomeRankingCategory (String)
Posted on Tuesday, 27 April 2010 12:00:00 (Romance Standard Time, UTC+01:00)
# | Comments [0]
 Wednesday, 13 May 2009

This is a brief story of my impressions and experiences with the first couple of days attending TechEd 2009 North America.

So after more than 24 hours of travelling from source (Århus, Denmark) to destination (Los Angeles, CA, USA)  I finally arrived at the hotel Saturday evening. I’m staying at a very nice hotel called Hollywood Roosevelt Hotel, just across Kodak Theatre (the place where the Oscar Academy Award takes place every year) on Hollywood Boulevard.


I was signed up to participate in the Pre-Conference part of TechEd, joining in on a whole-day seminar with the topic “The ASP.NET Performance Tuning Cycle”. Stuff I was really looking forward hearing about since we are focusing a lot on performance improvements at Vertica on our projects. The seminar was held by Richard Campbell and Kent Alstad and man those two Canadian guys were really on fire that day. We came around lots of different areas including how to do load-testing with Visual Studio 2008 Team System (Test Edition), load-balancing, how to analyze the response time of a web-site and much more. Generally a whole lot of good advices on how to look at the whole picture of optimizing a given web-site – where to put the energy basically. On advice I would like to highlight here is to use as an external tool to analyze your web-site.

After a great and educational day in company with Richard and Kent I was all psyched about the rest of the conference. I went to see the movie “Wolverine” after getting back to the hotel.

Day 1 – Keynote, ASP.NET 4.0, SharePoint

First day of TechEd started out with the Keynote speech as one would expect. I must admit I wasn’t that enthusiastic about this particular Keynote and as it turned out I wasn’t proved really wrong on that hunch. The Keynote was primarily held by Bill Veghte, Microsoft Senior Vice President on Windows Business. The topics were all about the IT-stuff going on right know with focus on the soon to come operating systems; Windows 7 and Windows Server 2008 R2. Not that I’m not interested in those topics at all, I just wanted to see some developer stuff too – unfortunately there was none.

The first actual session I attended was about ASP.NET 4.0 and what’s coming in that release. It was a pretty good one. Jeff King showed some examples of how you are now able to have more fine-grained control over the markup rendered by the ASP.NET WebForms Framework, some better support for SEO-stuff including new properties on the System.Web.Page class for meta-keywords and –description and generally some new controls to do LINQ-based operations (e.g. Filtering and Sorting) on your LINQ-enabled backend datasource.

The last two sessions I attended that day were both about SharePoint development. The first was focusing on tooling for SharePoint development, especially with focus on using the tool VSeWSS 1.3 (Visual Studio extensions for Windows SharePoint Services). The last session was about how to develop Windows Workflow Foundations to use inside WSS/MOSS applications. This session was held by Ted Pattison, SharePoint MVP and book-writer, and now from my experience a really good presenter. I didn’t get much out of the course technically-wise though since we’ve already been doing a lot of the stuff that he presented.

Next up after first-day sessions was the Partner Expo Reception event which I attended. It can best be described as a circus where all the audience gets magically drawn by all the stuff and weird contests offered by the different vendors. But they had food and beer, and I got a few good talks with some of the different vendors – including a nice demo by a Red Gate Software guy on the soon-to-be-released new version of ANTS Memory Profiler. And yeah of course I got a lot of swag too :-)

Day 2 – More SharePoint, C#, Commerce Server 2009, Parallels, Web Deployment

The second day started out with a morning session by Todd Bleeker on SharePoint Web Part Development Best Practices. Todd had a lot of energy on the stage and that was just really awesome! Even though the session was about Best Practices over half of the audience was rather new to Web Part development which had the impact of Todd having to explain a lot more of the basics taking time from the really interesting stuff. Pretty unfortunate also was that time completely ran out for Todd so he didn’t come around all of his points. All in all I think it was a great session mostly because of Todd’s enthusiasm. And I did get some good advices to take me back home.

I also attended Anders Hejlsberg’s session on “Future of C#”, which I enjoyed a lot – mostly because I think he rocks. To be more specific and professional about it I believe that the future “Compiler As A Service”-feature can really leverage some interesting possibilities to the table, e.g. for an easy way stick-in additional behavior to your code (logging, validation, pre-/post conditions, etc.) to allow cross-cutting concerns to be addressed as secondary concerns.

After having a brief chat with one of the guys at the Commerce Server booth he had me convinced that I should go to their interactive session on Commerce Server 2009 Foundation Services. So I did (later to discover that I thereby missed a Scott Hanselmann session!). Although they had a whole lot of technical problems at this session, I got a pretty good understanding of the upcoming Commerce Server 2009 R2 version including the support of having Commerce Server configured as a true 3-tier environment with Commerce Server as an application server in the middle of this. I’m soon to begin on a new Commerce Server 2009 project which I look really forward to, but seeing that new Foundation API kind of shocks me a little – to me it is extremely verbose compared to the CS 2007 API, and the amount of XML configuration doesn’t seem to have become any less I’m afraid. Perhaps wrapping the new very generic API in a nice fluent and slightly more specific API might just do the trick for me. We’ll see about that.

Next in line was a interesting session on Parallel Computing APIs with .NET 4.0. It gave me a good overview and examples of the possibilities with parallelism that you can get using the new framework that will be baked into .NET 4.0.

Last but not least this I attended a session on Web Application Deployment Packaging and Migration – a look into some new possibilities in IIS about importing and exporting applications and on how to package your solution to allow smooth GUI-enabled installation on IIS. At the session, Faith Allington showed the new Web Platform Installer from Microsoft which I personally think is a awesome tool. Both BlogEngine.NET and Umbraco got some visual attention at this session being on the list of web-applications available on the Web Platform Installer. Faith did really well on this presentation clearly having a lot of knowledge of what she was talking about.

All in all a great day with good sessions by excellent speakers.

Posted on Wednesday, 13 May 2009 05:25:37 (Romance Standard Time, UTC+01:00)
# | Comments [2]
 Monday, 29 September 2008

Jeg fik desværre ikke chancen for at arbejde videre med Umbraco sidst på ugen, forrige uge, pga. F#-arrangement i vores .NET brugergruppe i Århus, samt egen forberedelse til en præsentation og demo af et lille samspil mellem SharePoint 2007, InfoPath Forms og Windows Workflow Foundation.

Derudover kan jeg nævne at jeg i går var til TechTalk hos Microsoft med Anders Hejlsberg, chefarkitekt hos Microsoft på bl.a. C#, samt Steve Ballmer, CEO hos Microsoft. Det var hele køreturen fra Århus til Vedbæk værd, selvom arrangementet kun varede et par timer.

Tilbage til Umbraco. Som nævnt i min forrige post, ramte jeg en lille "mur" i forbindelse med installationen, da jeg ikke havde konfigureret File Permissions for mit Umbraco-website. Jeg Googlede mig vej til en post, som beskriver de foldere og filer som kræver opsætning. Desværre var det ikke helt nok for mig. Jeg måtte sætte Full Control på hele Umbraco-mappen for at få Umbraco til at "æde den". Jeg skal nok vende tilbage med en mere "sikker" løsning, når jeg får tid til at smide lidt tid efter det. Da det her installeres lokalt uden mulighed for at tilgå sitet udefra, kan jeg godt leve med risikoen.


Som det kan ses havde jeg problemer med ACL på mit Umbraco-website. En hurtig quick-fix var at sætte "Full Control" på hele mappen til kontoen "Network Service", som er den konto som afvikler websitet i IIS'en. Dette anbefales ikke til enhver form for produktionsmiljø.

Videre i installationen kom jeg, men allerede ved næste step kaster Umbraco en Exception i hovedet på mig. Se nedenstående skærmbilleder.


Ved klik på "Install", kaster Umbraco følgende Exception:


Kedeligt. Hvad kan man gøre ved det? Jeg vælger at kigge lidt på den kode som smider den Exception, med anvendelse af mit yndlingstool til decompilering af .NET kode: Lutz Roeders Reflector. Reflector er i øvrigt nu overtaget af softwarehuset Red Gate, som har en væld af yderst interessante tools til .NET og SQL i deres produktportefølje, herunder Ants Profiler og SQL Compare. Et hurtigt kig i koden hjælper imidlertid ingenting - så jeg må overveje andre alternativer. Èt af dem er at prøve igen. Jeg klikker på "Tilbage"-knappen i browseren, og klikker på Install-knappen endnu en gang. Det hjalp :-)


Videre i installationen - lækkert. Umbraco tjekker opsætningen af mine filrettigheder, og fortæller mig at det er perfekt sat op, hvilket også er fair nok, på trods af at jeg har sat Full Control på hele mappen. Så helt perfekt er det ikke - men det må jeg kigge på senere.

Igen fortsætter installationen, og nu står jeg på step 5/5 - hvor jeg skal vælge om jeg vil installere Boost. Boost er et nyt begreb i Umbraco 4, og er i følge screencastet af Niels Hartvig, et helt skrabet web-site som overholder en række Umbraco-konventioner (som jeg stadig ikke kender), og som lukker op for en anden feature: Nitros. Igen kan jeg kun trygt læne mig op af Niels Hartvigs definition af Nitros, som dækker over en afgrænset specifik funktionalitet, som f.eks. TopNavigation, standard SiteMap. Jeg har erfaring med WSS/MOSS (SharePoint) udvikling, og umiddelbart minder det rigtig meget om det vi her kender som "Features". Det lyder meget lovende - og mon ikke jeg burde prøve at lave min egen lille Nitro i forbindelse med det her projekt. Jeg følger Niels' guidelines, og installerer Boost med de Nitros som installationen finder.


Et klik på "Install Boost"-knappen bekræfter at jeg har brugt for meget tid på at skrive den her post (og i øvrigt lave en masse andet), end at rent faktisk gennemføre selve installationen af Umbraco, for jeg får straks smidt følgende Exception i hovedet:


Min bruger har simpelthen fået et timeout af Umbraco/ASP.NET. Helt forståeligt. Løsningen var ret simpel; jeg besøgte "http://localhost/umbraco" som er adressen til selve administrationsdelen af Umbraco. Her loggede jeg ind med den bruger som blev oprettet i forbindelse med installationen.

Tilbage til installationen, og et klik på "Install Boost", får mig videre til næste side (se nedenstående skærmbillede), hvor jeg kan vælge de Nitros som skal installeres med sitet. Jeg vælger at installere dem alle.



Hermed er Umbraco 4 installeret på Windows Server 2008 med SQL Server 2008. I Rock!

Posted on Monday, 29 September 2008 18:37:57 (Romance Standard Time, UTC+01:00)
# | Comments [0]
 Wednesday, 24 September 2008

I aften var det sidste onsdag i måneden, ergo afholdte vi vores faste månedlige møde i Århus .NET UserGroup (ANUG). Denne gang havde vi inviteret Christian Holm Nielsen til at udgøre den som hovedtaler. Der var lagt på bordet til en gang snak om F#. Et .NET baseret sprog som har været under udvikling i Microsoft Research afdeling, og som nu er udkommet i en CTP-release, og som bl.a. har lagt grund for nogle af de sprog features som vi har fået i C# 3.0 (herunder type inference, og flere eksempler fra denne blog-post om "The Roots of C# 3.0: F# and C-Omega").

Christian gennemgik en langt række eksempler på sprog-features i F#, herunder tupler, sequences, smileys (intern joke), immutable types o.m.a.

Det var super flot at Christian sammen med sin kollega var interesseret i at køre hele vejen fra Odense for at give en præsentation i vores brugergruppe her i Århus. Thumbs up for præsentationen. Klaus Hebsgaard var endda så heldig at vinde en F#-bog for at have stillet aftenens spørgsmål omkring type inference.

Dvs. dagen er 100 % gået med arbejde, og direkte til Usergrup, så jeg har desværre ikke fået arbejdet videre med mit Umbraco-projekt. To be continued...

Posted on Wednesday, 24 September 2008 20:08:25 (Romance Standard Time, UTC+01:00)
# | Comments [0]
 Tuesday, 23 September 2008

Update: Jeg har uploadet nye versioner til de forskellige screen-shots.

Okay, nu er SQL Server 2008 installeret på Windows Server 2008, så nu er jeg endelig klar til at komme igang med at prøve at installere Umbraco 4.

Nedenfor følger de første par trin jeg fulgte for at installere Umbraco (med inspiration fra Niels Hartvigs screencast om netop dette):

  1. Download nyeste version fra
  2. Kopiere den udpakkede version til c:\inetpub\wwwroot\
  3. Oprette ny SQL Login bruger i SQL Server 2008 -> UmbracoApp
  4. Oprette ny Database i SQL Server 2008 -> UmbracoApp
  5. Oprette nyt web-site i IIS der peger på c:\inetpub\wwwroot\ - sørg for at AppPool'en anvender "Classic .NET AppPool"
  6. Starte en browser og ind på http://localhost


Update: exception-1-assembly-binding-redirect-large.gif

Hvorefter jeg ind i første forhindring, som du kan se af ovenstående skærmbillede. Sagen er at Umbraco forventer at jeg har en bestemte versioner af følgende assemblies "System.Web.Extensions" og "System.Web.Extensions.Design" installeret i min GAC (Global Assembly Cache). Det har jeg ikke - tværtimod har jeg en nyere version af netop denne assembly - så der skal lige lidt fodarbejde for at få min Umbraco applikation til at forstå dette. Heldigvis er sådanne scenarier understøttet fuldt ud af .NET runtimen, og kræver blot et par linier af konfiguration i web.config (se nedenstående skærmbillede). Så ingen onde ord om Umbraco på den front.


Update: fix-assembly-binding-large.gif

Herefter indlæste første side af Umbraco konfigurations-wizarden fint. Lækkert. Videre til step 2/5, hvor det begynder at blive spændende. Her skal jeg opsætte forbindelse til min database. I første forsøg fejler installationen da jeg trykker på "Confirm"-steppet. Men jeg skulle bare lytte videre til Niels Hartvigs screencast, som netop omtaler at det kræver konfiguration af filrettigheder til inetpub-biblioteket og web.config.

En hurtig Google-search leder mig i retning af en side fra Umbracos online dokumentation - som under "Configure IIS for Umbraco" fortæller mig dét jeg skal vide.

Det kigger jeg så videre på i morgen...

Posted on Tuesday, 23 September 2008 21:58:15 (Romance Standard Time, UTC+01:00)
# | Comments [3]
 Monday, 22 September 2008

Okay, som nævnt i min forrige post vil jeg gerne anvende et isoleret, virtuelt miljø til at teste Umbraco. Til det formål har jeg downloadet en evaluation VHD af Windows Server 2008 Enterprise edition hos Microsoft. For at få gang i det miljø, har jeg installeret Virtual Server 2005 R2 SP1 til at hoste VHD'en.

Som default er Windows Server 2008 installeret stortset uden features/serverroller, som potentielt kan åbne systemet for angreb (disclaimer: jeg kan sagtens tage fejl - har sjældent fingrene direkte i konfigurationen af operativsystemer), så derfor har jeg som noget af det første haft gang i at installere og konfigurere serveren til at køre IIS 7.0 (Internet Information Services) til afvikling af Umbraco som er en ASP.NET web-site applikation.

Det næste jeg skal have installeret er SQL Server 2008 Express... Mere herom...

Posted on Monday, 22 September 2008 19:58:55 (Romance Standard Time, UTC+01:00)
# | Comments [0]

Hos Vertica anvender vi SCRUM som procesmodel for vores softwareprojekter, så jeg tænkte det måske ville være et udmærket udgangspunkt for ligesom at få lidt struktur på mit lille projekt her. Jesper har allerede inddelt projektet i faser, så det vil jeg da drage lidt nytte af. Læringsfasen slutter den 12. oktober, så det giver lige præcis tre uger fra og med i dag. Jeg har oprettet et lille regneark inde i Google Docs som jeg vil bruge til at oprette og prioritere opgaver mv. Måske overkill, men det finder vi ud af...

Nå, vi er jo ikke kommet for at snakke, så nu er det på tide at komme igang med Umbraco, så ind på hjemmesiden med mig....

Ganske ganske kort om Umbraco

Umbraco er i dag et open source CMS (Content Management System). Umbraco blev stiftet af Niels Hartvig i år 2000, og siden da har det oplevet en voldsom vækst og popularitet. Du kan finde alt den information om Umbraco du kan drømme om direkte på Umbraco web-sitet, herunder pod- og screencasts.

Jeg har haft chancen for at møde Niels Hartvig personligt, da vi sidste år inviterede ham op til Vertica til en snak om Microsoft Commerce Server og Umbraco. Et rigtig spændende møde.

Valg af version

Da dette projekt ikke skal bruges til noget decideret kundeprojekt, men blot fungere som "Proof-Of-Concept on getting started with Umbraco", har jeg valgt at basere mig på den allernyeste version jeg kan fingrene i (Umbraco 4.0 Beta 1), og dermed ikke spekulere så meget over at denne specifikke version stadig er i beta.

Installation og konfiguration af Umbraco 4.0

Perfekt - Niels Hartvig har lavet en screencast omkring selve installationen af Umbraco 4.0. Så kan det ikke blive meget nemmere - det eneste problem er at jeg skal have stablet et virtuelt miljø på banen, så jeg kan teste og arbejde med Umbraco i et isoleret miljø. Det giver mig samtidig også chancen for at afprøve Windows Server 2008 og SQL Server 2008 - nu må vi se om det spiller godt sammen med Umbraco 4.0.

Posted on Monday, 22 September 2008 16:23:29 (Romance Standard Time, UTC+01:00)
# | Comments [0]

(In English: I've signed up for a contest on a Danish community site for developers, where you have to learn about a new technology and write blogposts about your experience with that. One of the requirements for this contest is that all written material have to be in Danish. Sorry.)

Jeg har været medlem på det danske udviklersite siden det dengang hed Active Server Pages og hvor det var Dennis Knappe som stod i spidsen for sitet. Jeg benytter mig stadig af, dog sjældent til at stille spørgsmål, og desværre sjældent til at besvare på andres spørgsmål. Til gengæld fungerer sitet for mig som en indgangsportal til flere af de danske bloggere som jeg jævnligt følger med i, samt til at opfange de events mv. som der arrangeres fra tid til anden, herunder Geek-Dinners. bliver i dag styret af en gut som jeg ved flere lejligheder har haft chancen for at møde, nemlig Jesper Blad Jensen aka Deldy.

Konkurrencen i korte træk...

Jesper har sammen med Daniel Mellgaard Frost fra Microsoft sat en konkurrence sammen, hvor det gælder om at sætte sig ind i en ny selvvalgt teknologi inden for en given tidshorisont. Alt i mens skal man blogge om sine daglige oplevelser med denne nye teknologi, og i slutperioden af konkurrencen skal man skrive en artikel hvor man sammenfatter hele oplevelsen. Ham/hende som har leveret det bedste arbejde kan vælge mellem en række præmier udlovet af Microsoft.

Kort om mig

Mit navn er Brian Holmgård Kristensen. Jeg blev uddannet datamatiker fra Skive i 2005, og har siden bl.a. arbejdet som ERP-udvikler (Microsoft Dynamics AX) hos en virksomhed i Viborg. Siden maj 2007 har jeg dog arbejdet som .NET udvikler i en virksomhed der hedder Vertica, der ligger inde midt i Århus. Jeg har beskæftiget mig med udvikling i en del år efterhånden, med fokus på web-udvikling. Jeg er medstifter af Århus .NET UserGroup (, hvor jeg stadig er en aktiv del af kernegruppen, og har også haft æren af at lave en både en præsentation om ASP.NET samt en workshop. Hvis du vil vide lidt mere om hvem jeg er, kan du læse min introduktions-post jeg skrev sidste år da jeg oprettede bloggen, eller besøge min LinkedIn-profil - og du er selvfølgelig også velkommen til at kontakte mig direkte.

Hvad deltager jeg med

Jeg vil gerne i gang med at arbejde med Umbraco. I første omgang bliver det at forstå hele pakken der følger med Umbraco, det være sig installation, konfiguration, maskineriet, plug-ins osv. Det næste for mig vil være hvordan jeg bygger ovenpå Umbraco løsningen – og med at bygge ovenpå mener jeg at anvende de teknologier og værktøjer som jeg normalt sidder med i min arbejdsdag; unit-testing, Inversion of Control, MVP, etc.. – f.eks. sådan at jeg kan integrere mine eCommerce løsninger med Umbraco (med anvendelse af f.eks. Microsoft Commerce Server nedenunder).

Hvorfor jeg deltager...

... fordi jeg synes det er et brand-godt initiativ som jeg gerne vil støtte op omkring, og fordi jeg rigtig gerne vil lære at anvende Umbraco som CMS, da det er et produkt vi overvejer at bruge professionelt på min arbejdsplads, samt i mit fritidsfirma

Dette er blot min lille introduktionspost til konkurrencen - løbende vil der selvfølgelig komme mange flere post, as we go by.

Posted on Monday, 22 September 2008 14:23:10 (Romance Standard Time, UTC+01:00)
# | Comments [0]