Click here to Skip to main content
16,016,537 members
Articles / Web Development / IIS

WCF by Example - Introduction

Rate me:
Please Sign up or sign in to vote.
4.91/5 (83 votes)
28 May 2013CPOL9 min read 460.7K   1.3K   532   72
Patterns and best practices for the desing and development of rich client enterprise applications using WPF, WCF and NHibernate
Next
Chapter I

Latest modifications 

New on 28th May 2013:
I submitted an article on the Azure Contest at LiteDispatch - Logistic solution on the cloud[^] In this article I am using the same patterns covered in these series. But a different aspect is that this is an example of an MVC 4 application that uses EF Code First; it discusses how to integrate an MVC application in AzureWebSites using SQL-CE  and then it covers what it takes to get the application running on Azure SQL Server. It also contains interesting aspects like EF Migrations and a discussion on hybrid persistence configurations where two EF contexts are set to run within a single application. One connected to SQL-CE and the other to  Azure SQL Server. As well, the project is a working example of the Simple Membership using EF Code First and SQL-CE. The application can be found at http://litedispatch.azurewebsites.net/[^

 Image 2

The last article added to the series is WCF by Example - Chapter XVI - EF 5 & SQL CE - AzureWebSites Deployment, this article was added in Feb 2013 and discusses how to implement a Unit of Work and Repository using Entity Framework Code First within the eDirectory solution. This article also discusses how to deploy the solution on Azure WebSites. 

The source code for the articles is located at its own project in Codeplex, latest changes can be found at the trunk branch.

In Feb 2013 EF support was added to the solution, I used EF Code First and SQL-CE. 

In Dec 2012, RavenDB support was added to the solution.

In Oct 2012, the solution was amended so NHiberante is also configured to work with SQL-CE 4.0; previously it was only working for SQL Server or the Express versions; you may want to check it out to see what it takes to get your application running using SQL-CE and NHibernate. 

In Dec 2010, the server side of the application was deployed to Azure, a ready-to-run client is available on codeplex. The WPF client can invoke methods to a WebRole deployed in Azure. This source code can be found at CodePlex at eDirectory.WPFClient.Azure.zip 

You may want to follow series/code updates at: @enriquealbert/wcfbyexample

Introduction

This article is the first of a series that discusses how to design and develop a WPF client using WCF for communication and NHibernate for persistence purposes. Actually, the solution can be configured to use one of the following persistence implementations: NHibernate, EF, InMemory and RavenDB.

Designing enterprise applications requires a comprehensive set of skills. In small and medium projects allocation of time and resources could be not feasible to the extent that is in larger projects, it is at this time where a source for best practices and patterns can become very beneficial. There are plenty articles, books and other materials covering specific aspects but it is almost impossible to find a single place where all the technologies and patterns are used in conjunction providing a comprehensive discussion of the why and how.

The intention of these articles is to provide an example of how a full enterprise application is developed from the early stages to a full functional stage. The articles build on top of each other where new aspects are covered or/and existing functionality is enhanced as a result of aligning the architect to the business non-functional requirements.

It is assumed in the series that Agile practices are followed so the solution's architect focuses in providing flexible mechanisms for RAD, DDD and TDD methodologies. One key aspect of the architect is the requirement to be able to deploy a full-functional client for business exploration purposes that requires a minimum infrastructure footprint; avoiding databases, deployment to IIS and so on. 

Background 

The architect requirements are as follow: 

  • Rich client using WPF  
  • Client connects to server using WCF services  
  • NHibernate, EF, RabenDB are used for persistence purposes  
  • Client application can be run against in-memory repositories (Exploration Client)
  • Deployment of the exploration client must be kept simple  
  • The application must be easily testable, tests can be run against any of the implemented repositories

Other assumptions:

  • We have full control over the client and server components
  • We are creating the database from scratch, we are not using some legacy database
  • We are deploying the server components using IIS7 and WAS; we will use TCP/IP
  • We have full design control over the PK in the database tables, we will using unique long fields for all our entities in this project

The eDirectory solution

We are going to start using a very simple business scenario in our series, the focus on the series is the architecture not the business domain. We may extend our domain in the future if we find that we want to explore some more complex architect concepts. 

The business domain is based in a simple list of contacts, it is currently so simple that one single entity is only required: Customer. The solution name is eDirectory. 

The source code can be found at codeplex: WCF by Example  

The latest version can be found at the trunk branch, each chapter is located at its own tag branch. You may want to use the browse function within Codeplex to navigate among the branches. 

Architect Overview 

The eDirectory application defines three well differentiated application components: the database, server and client. 

wcfbyexample_introduction/architecture_highlevel.gif

Within the client and server the application is structured into layers, in most cases the layers are stacked one beside each other, continuous layers are provided with decoupled mechanisms so different implementations can be used. Some services are available across multiple layers.

As we earlier mentioned, we have full control of the clients and server. So we will not relay on late service discovery, instead the service contracts are available at both sides of the application. This is also true for the DTOs and some common business validation. As a result, a Common assembly is defined that contains components shared by the server and client applications.  

wcfbyexample_introduction/common_components.gif

In the server side we find the core components, the business domain declares the business entities and their behavior (action methods). Then services are declared that exposes our domain action methods. The services for persistence and serialisation constraints only expose DTOs between the client and server. As a result, the transformation of entities to DTOs needs to be addressed in a comprehensive manner.  

In order to decouple our business domain from the database, the repository components are responsible for the persistence of our entities. We will define a generic interface between these two layers. Four concrete implementations of the repositories are available: in-memory, NHibernate, Entity Framework and RavenDB.

The transaction manager is our "unit of work" implementation. It is responsible for our business transactions and the handling of business messages (warnings and exceptions).

wcfbyexample_introduction/server_components.gif

Finally, but not the least, we have the client components. The client is a WPF application designed using the MVVM pattern. This pattern provides a neat view XAML component with none or very little code behind, the binding capabilities of XAML in conjunction with the ViewModel class leverages how the client renders the DTOs provided by the services layers.

The client decouples the service layers into two main components. The adapter is responsible for the managing of business messages retrieved during the execution of services. The WCF Proxy layer is responsible for the management of WCF services, the design is neat and is a nice way of decoupling the client from the WCF service.

wcfbyexample_introduction/client_components.gif

Available articles in Codeproject

Date Article
28-June-2010 WCF by Example - Chapter I - Baseline
05-July-2010 WCF by Example - Chapter II - Repository Locator
10-July-2010 WCF by Example - Chapter III - Response
16-July-2010 WCF by Example - Chapter IV - Transaction Manager
23-July-2010 WCF by Example - Chapter V - Contexts
31-August-2010 WCF by Example - Chapter VI - Baseline MVVM
04-September-2010 WCF by Example - Chapter VII - Contract Locator
15-September-2010 WCF by Example - Chapter VIII - Relay Command
19-September-2010 WCF by Example - Chapter IX - Notify Property Change
16-October-2010 WCF by Example - Chapter X - DI with Spring.Net
04-November-2010 WCF by Example - Chapter XI - NHibernate Implementation
24-November-2010 WCF by Example - Chapter XII - WCF Implementation
19-December-2010 WCF by Example - Chapter XIII - Business Domain Extension
07-January-2011 WCF by Example - Chapter XIV - Validation & Exception Management
16-December-2012 WCF by Example - Chapter XV - RavenDB Implementation
12-February-2013 WCF by Example - Chapter XVI - EF 5 & SQL CE - AzureWebSites Deployment

Available chapters (source code) in Codeplex

Date Chapter
14-June-2010 Chapter I - Baseline
14-June-2010 Chapter II - Response
14-June-2010 Chapter III - Response
14-June-2010 Chapter IV - Transaction Manager
14-June-2010 Chapter V - Service Locator
14-June-2010 Chapter VI - Baseline MVVM
14-June-2010 Chapter VII - Contract Locator
29-July-2010 Chapter VIII - RelayCommand
29-July-2010 Chapter IX - Notify Property Changed Pattern
29-July-2010 Chapter X - Dependency Injection
12-September-2010 Chapter XI - NHibernate Implementation
07-October-2010 Chapter XII - WCF Implementation
14-November-2010 Chapter XIII - Business Domain Extension
12-December-2010 Azure Solution - In-memory mode WebRole
07-January-2011 Chapter XIV - Validation & Exception Management
07-October-2011 Client re-factor: ServiceAdapter & CommandDispatcher pattern 
16-December-2012 RavenDB Implementation
12-February-2013 Entity Framework Implementation

Future chapters 

Chapter State
Azure Deployment - In-memory WebRole Source code is available

History

14 June 2010 - Introduction article was created.
28 June 2010 - Chapter I is done and series are published.
05 July 2010 - Chapter II was added to the series
10 July 2010 - Chapter III was added to the series
16 July 2010 - Chapter IV was added to the series
23 July 2010 - Chapter V was added to the series
31 August 2010 - Chapter VI was added to the series
04 September 2010 - Chapter VII was added to the series
15 September 2010 - Chapter VIII was added to the series
19 September 2010 - Chapter IX was added to the series
07 October 2010 - Source code for Chapter XII is available at CodePlex
16 October 2010 - Chapter X was added to the series
04 November 2010 - Chapter XI was added to the series
24 November 2010 - Chapter XII was added to the series
12 December 2010 - In-memory WebRole is deployed to MS Azure
19 December 2010 - Chapter XIII was added to the series
07 January 2011 - Chapter XIV was added to the series
09 February 2011 - Chapter XIV section 2 was added to the series
07 October 2011 - Client re-factor was made available on Codeplex
20 October 2012 - SQL-CE 4.0 support was added to the solution
16 December 2012 - RavenDB implementation
12 February 2013 - Entity Framework implementation
28 May 2013 - Mention to the LiteDispatch MVC project in Azure 


License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
Ireland Ireland
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionSource code no longer available Pin
alrhr5-Feb-22 5:42
alrhr5-Feb-22 5:42 
AnswerRe: Source code no longer available Pin
Enrique Albert5-Feb-22 7:16
Enrique Albert5-Feb-22 7:16 
GeneralRe: Source code no longer available Pin
alrhr8-Feb-22 23:31
alrhr8-Feb-22 23:31 
QuestionAbout deploy Pin
lincolwn3-Nov-16 9:27
lincolwn3-Nov-16 9:27 
AnswerRe: About deploy Pin
Enrique Albert6-Nov-16 10:23
Enrique Albert6-Nov-16 10:23 
GeneralChanges to be done for Database first approach using EF5. Pin
Member 1114281623-Aug-15 3:00
Member 1114281623-Aug-15 3:00 
GeneralRe: Changes to be done for Database first approach using EF5. Pin
Enrique Albert7-Oct-15 1:27
Enrique Albert7-Oct-15 1:27 
QuestionWhat is the reason behind System.NullReferenceException? Pin
Member 1114281619-Aug-15 23:52
Member 1114281619-Aug-15 23:52 
AnswerRe: What is the reason behind System.NullReferenceException? Pin
Enrique Albert20-Aug-15 0:17
Enrique Albert20-Aug-15 0:17 
GeneralRe: What is the reason behind System.NullReferenceException? Pin
Member 1114281620-Aug-15 3:12
Member 1114281620-Aug-15 3:12 
GeneralRe: What is the reason behind System.NullReferenceException? Pin
Enrique Albert7-Oct-15 1:29
Enrique Albert7-Oct-15 1:29 
QuestionCreating Entities of Domain is tiresome. Pin
Member 1114281611-Aug-15 0:20
Member 1114281611-Aug-15 0:20 
AnswerRe: Creating Entities of Domain is tiresome. Pin
Enrique Albert11-Aug-15 6:47
Enrique Albert11-Aug-15 6:47 
GeneralRe: Creating Entities of Domain is tiresome. Pin
Member 1114281611-Aug-15 18:05
Member 1114281611-Aug-15 18:05 
GeneralMy vote of 5 Pin
Victor Arnoldo Olvera6-Jun-15 4:51
Victor Arnoldo Olvera6-Jun-15 4:51 
GeneralMy vote of 5 Pin
Southmountain25-Feb-14 9:45
Southmountain25-Feb-14 9:45 
GeneralRe: My vote of 5 Pin
Enrique Albert17-Mar-14 23:42
Enrique Albert17-Mar-14 23:42 
GeneralMy vote of 1 Pin
Cristian Capannini26-Nov-13 0:17
Cristian Capannini26-Nov-13 0:17 
BugChapter 1 button link Pin
Felipe Seixas20-Oct-13 18:39
Felipe Seixas20-Oct-13 18:39 
GeneralMy vote of 5 Pin
wsc091830-May-13 22:09
wsc091830-May-13 22:09 
GeneralRe: My vote of 5 Pin
Enrique Albert30-May-13 22:54
Enrique Albert30-May-13 22:54 
GeneralMy vote of 5 Pin
vinodkumarnie14-Mar-13 20:51
vinodkumarnie14-Mar-13 20:51 
GeneralMy vote of 5 Pin
CS140116-Feb-13 18:18
CS140116-Feb-13 18:18 
GeneralMy vote of 5 Pin
Renju Vinod18-Dec-12 17:27
professionalRenju Vinod18-Dec-12 17:27 
GeneralMy vote of 5 Pin
Rudolf Grauberger5-Aug-12 13:32
Rudolf Grauberger5-Aug-12 13:32 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.