Friday, June 26, 2009

CodeStock 2009 - The C# Developer's Guide to F#

Thanks to all who came out to my session today at CodeStock 2009. The slide deck and code samples are provided below:

- Slide Deck
- F# Survey Provider Sample
- F# Script Samples

Sunday, May 17, 2009

CodeStock 2009 Session: The C# Developers Guide to F#

The CodeStock 2009 speakers/sessions were announced today and I am honored to say that I will be providing a session entitled "The C# Developers Guide to F#".  Thanks to all who voted for this session and I can't wait to see you all there!

Join me at CodeStock

Tuesday, March 24, 2009

Upcoming Developer Events/Conferences

There are several upcoming developer events/conferences of which I want to make sure that everyone is aware.

April 11 (tentative) - F# Fire Starter - Nashville, TN

This is going to be a great event full of presentations, demonstrations, pair programming, and open spaces.  It's open to all levels of developers with all levels of F# experience.  I'll be providing more information as it becomes available.

June 26-27 - CodeStock 2009 - Knoxvillle, TN

This is a great event where Open Spaces are mixed with a traditional conference.  The cost is just $25 and registration will open on or after March 31st.

August 13-15 - devLink 2009 - Nashville, TN

DevLink features over 75 sessions of technical content intended to make you more knowledgeable and marketable.  Registration opens April 1st and the early bird cost is $75.  Note: This conference sells out every year, so get your ticket early!

 

Friday, March 20, 2009

Presentation: An Introduction to F# - Slides and Sample Code

Thanks to all who came out to the Nashville .NET User Group last night. As promised, here are the slides and examples.

Click here for a zipped file containing the slides and sample script.

Click here for a zipped file containing the source code of the sample application.

Tuesday, March 17, 2009

Sample F# Application - A Simple Quiz Provider

One of the things that we will be discussing at the Nashville .NET User Group Tomorrow night, March 19, 2009, is a sample application that has a service layer built in F#.  To access the sample code click here.

A few notes:

- The code is broken out into two main layers: Service and Presentation. 

- The service layer is built in F# and the presentation layer is build in C# with ASP.NET MVC RC1.

- The tests are written in C# (even in the service layer) to provide examples of language interoperability.

- To keep things as simple as possible, the data is stored in an XML file rather than a database.  All interaction with the data is through Linq to XML.

- The intent of this example is to help existing object-oriented developers ease into the language.  Because of this, many functional programming approaches are not utilized to the full extent.

- This uses the F# Sept. 2008 CTP.


Monday, March 16, 2009

F# Presentation at the Nashville .NET User Group

I will be providing a presentation at the Nashville .NET User Group this Thursday, March 19, 2009. Here's the information:

Presentation: "An Introduction to F#"

Abstract :


What is F#?  Why should you care?  What advantages can F# provide for real world developers?

In this presentation we will answer these questions, cover the basic syntax of F#, and explore a sample F# line-of-business application.

Sunday, January 18, 2009

Building a RESTful Service with WCF and F#

There has been a lot of discussion recently, centered on the idea of making services RESTful.  REST (Representational State Transfer) "is a key design idiom that embraces a stateless client-server architecture in which the web services are viewed as resources and can be identified by their URLs." (1)  This post will provide a simple example of creating a RESTful service with WCF and F#. 

Creating the project:

The first step in building our example is to create a new F# Library project.  I chose to name this project "FSharpWCF".  The next step is to add references to System.Runtime.Serialization, System.ServiceModel, and System.ServiceModel.Web.

Building the contracts:

The code looks only slightly different than an equivalent in a language such as C#, though there are a couple of key things that should be pointed out.  First, System.ServiceModel.Web has been opened.  This is the namespace that allows us to use the WebGet attribute.  The WebGet attribute allows us to set a UriTemplate that will be used for navigation to our service.  Our UriTemplate is set to "temp/{value}", which indicates that navigating to the base URL/temp/{value} will return the result of the service.  {value} associates directly with the parameter named value in our GetData operation.  The last important thing to notice is the assignment of the name "value" to the request argument of the GetData operation (i.e. abstract GetData : value:string -> string).  For more information on this, see this post by Ted Neward.

#light
namespace FSharpWCF

open System
open System.Runtime.Serialization
open System.ServiceModel
open System.ServiceModel.Web

[<ServiceContract>]
type IGetDataService = interface 
    [<WebGet(UriTemplate="temp/{value}")>]
    [<OperationContract>]
    abstract GetData : value:string -> string
end

type GetDataService() = 
    interface IGetDataService with
        member this.GetData value =
            sprintf "You entered: %s" value


Adding an app.config file:

Since an F# library doesn't have App.config as an option when adding a new item, you will need to create the file in the project directory manually, then add it as an existing item.  The main thing to notice is the addition of the endpointBehaviors section and the association of this behaviorConfiguration to the endpoint.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="FSharpWCF.GetDataService" behaviorConfiguration="FSharpWCF.GetDataServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8080/FSharpWCF/GetDataService/" />
          </baseAddresses>
        </host>
        <endpoint binding="webHttpBinding" contract="FSharpWCF.IGetDataService" 
                  behaviorConfiguration="Web">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="FSharpWCF.GetDataServiceBehavior">
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="Web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>


Testing the service:

To test your new service, do the following:

1. Right click on the FSharpWCF project and select properties.
2. Navigate to the Debug tab, change the start action to "Start external program:" and locate the WcfSvcHost.exe on your development machine (i.e. C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\WcfSvcHost.exe).
3. Add the following "command line arguments:" /service:FSharpWCF.dll /config:FSharpWCF.dll.config
4. Set "Working directory:" to the directory of these DLLs.

You should now be able to launch the service by running the project from Visual Studio.  This will host your service with WcfSvcHost and allow you to access your service from a browser.  (Note: WcfSvcHost should only be used for testing purposes.  You should never use this as a production host.)

To use the service, open a browser and navigate to http://localhost:8080/FSharpWCF/GetDataService/temp/2 and you should receive <string>You entered: 2</string> as a result. 

Conclusion:

That's all there is to it.  The service can now be viewed as a resource that can be identified by it's URL. 


Resources:

1. http://java.sun.com/developer/technicalArticles/WebServices/restful/