Click here to Skip to main content
12,250,257 members (50,219 online)
Click here to Skip to main content

Stats

117.1K views
1.7K downloads
149 bookmarked
Posted

Building a 3-Tier App with Silverlight 3, .NET RIA Services, and Azure Table Storage

, 11 Jul 2009 CDDL
This article presents the techniques and caveats of building a 3-tire Azure hosted application using Silverlight 3 (presentation tier), .NET RIA services (business logic and data access), and Windows Azure Table (data storage).
Azurelight
Azure
DomainServices
Linq
Properties
StorageClient
Azurelight
Azurelight
Azurelight.ccproj
Azurelight_WebRole
ServiceConfiguration.cscfg
ServiceDefinition.csdef
Azurelight_WebRole
App_Data
Azurelight.mdf
Azurelight_log.ldf
App_GlobalResources
System.Web.Silverlight.dll
ClientBin
Global.asax
Model
Properties
Service
AzurelightNav
Command
Control
Generated_Code
Model
Properties
Resources
SilverlightCairngorm
Business
Command
Control
Model
Properties
Views
using System;
using System.Windows;
using System.ComponentModel;
using System.Windows.Threading;

namespace SilverlightCairngorm
{
	/// <summary>
	/// modestyZ: 2008.10
	/// Abstract class that makes INotifyPropertyChanged implementation thread-safe
	/// Any type that serves as DataContext for data binding in a multi-threaded application should derive from this type
	/// </summary>
	public abstract class BindableBase : INotifyPropertyChanged
	{
		//the dispatcher to ensure the PropertyChange event will raised for UI thread to update bound data
		protected Dispatcher currentDispatcher;

		public BindableBase() : this(null) { }

		public BindableBase(Dispatcher uiDispatcher)
		{
			currentDispatcher = uiDispatcher;
		}

		#region INotifyPropertyChanged Members

		public event PropertyChangedEventHandler PropertyChanged = delegate { };
		protected void NotifyPropertyChanged(string propertyName)
		{
			//the dispatcher initialization is deferred till the first PropertyChanged event raised
			CheckDispatcher();
			
			//check if we are on the Dispatcher thread if not switch
			if (currentDispatcher.CheckAccess())
				PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
			else
				currentDispatcher.BeginInvoke(new Action<string>(NotifyPropertyChanged), propertyName);
		}

		#endregion

		/// <summary>
		/// check and initialize the UI thread dispatcher when the custructor passed in null dispatcher instance
		/// </summary>
		protected void CheckDispatcher()
		{
			if (null != currentDispatcher)
				return;

			if (Application.Current != null &&
				Application.Current.RootVisual != null &&
				Application.Current.RootVisual.Dispatcher != null)
			{
				currentDispatcher = Application.Current.RootVisual.Dispatcher;
			}
			else // can't get the Dispatcher, throw an exception 
			{
				throw new InvalidOperationException("CheckDispatcher must be invoked after that the RootVisual has been loaded");
			}
		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Common Development and Distribution License (CDDL)

Share

About the Author

Modesty Zhang
Technical Lead
United States United States
https://github.com/modesty

https://www.linkedin.com/in/modesty-zhang-9a43771

https://twitter.com/modestyqz

You may also be interested in...

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.160426.1 | Last Updated 12 Jul 2009
Article Copyright 2009 by Modesty Zhang
Everything else Copyright © CodeProject, 1999-2016
Layout: fixed | fluid