RSS Feed
Mar 2

A singleton base class to implement the singleton pattern in C#

Posted on Tuesday, March 2, 2010 in Programming

The singleton design pattern is one of the most controversial pattern. Some people even call it anti-pattern, evil, or stupid. I won’t go into the debate now, but I just want to share something for those who need to use singletons.

Although it is one of the easiest pattern to understand, it is also very easy to code it poorly, leading to unexpected side effects such as poor performance or being not thread-safe.

Jon Skeet has written a very good article describing different implementations of the singleton pattern in C#. He gives a nice example on how you can write a singleton code that is thread-safe and lazy-instantiating. The code is less than 20 lines and you can use it as a template for your singletons.

Since in some projects I have created several singleton objects, it started to get repetitive. Therefore I decided to write a base class based on this pattern as follows:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using System;
using System.Globalization;
using System.Reflection;
 
public abstract class SingletonBase<T> where T : class
{
  /// <summary>
  /// A protected constructor which is accessible only to the sub classes.
  /// </summary>
  protected SingletonBase() { }
 
  /// <summary>
  /// Gets the singleton instance of this class.
  /// </summary>
  public static T Instance
  {
    get { return SingletonFactory.Instance; }
  }
 
  /// <summary>
  /// The singleton class factory to create the singleton instance.
  /// </summary>
  class SingletonFactory
  {
    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static SingletonFactory() { }
 
    // Prevent the compiler from generating a default constructor.
    SingletonFactory() { }
 
	internal static readonly T Instance = GetInstance();
 
    static T GetInstance()
    {
      var theType = typeof(T);
 
      T inst;
 
      try
      {
        inst = (T)theType
          .InvokeMember(theType.Name,
            BindingFlags.CreateInstance | BindingFlags.Instance
            | BindingFlags.NonPublic,
            null, null, null,
            CultureInfo.InvariantCulture);
      }
      catch (MissingMethodException ex)
      {
        throw new TypeLoadException(string.Format(
          CultureInfo.CurrentCulture,
          "The type '{0}' must have a private constructor to " +
          "be used in the Singleton pattern.", theType.FullName)
          , ex);
      }
 
      return inst;
    }
  }
}

For an example of usage, we will create a singleton class that generates a sequence number:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Must seal the class so no sub-classes can be defined.
public sealed class SequenceGeneratorSingleton
  : SingletonBase<SequenceGeneratorSingleton>
{
  // Must have a private constructor so no instance can be created externally.
  SequenceGeneratorSingleton()
  {
    _number = 0;
  }
 
  private int _number;
 
  public int GetSequenceNumber()
  {
	return _number++;
  }
}

Then, a console application will call the sequence generator class:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Program
{
  static void Main(string[] args)
  {
    Console.WriteLine("Sequence: " + SequenceGeneratorSingleton.Instance
	  .GetSequenceNumber().ToString());  // Print "Sequence: 0"
 
    Console.WriteLine("Sequence: " + SequenceGeneratorSingleton.Instance
	  .GetSequenceNumber().ToString());  // Print "Sequence: 1"
 
    Console.WriteLine("Sequence: " + SequenceGeneratorSingleton.Instance
	  .GetSequenceNumber().ToString());  // Print "Sequence: 2"
  }
}

To recap, in order to create a singleton class using the singleton base class, you need to do the following:

  1. Define a sealed class which derives from SingletonBase<T>, where T is the class name you are defining. It ensures that you cannot create subclasses from this singleton class.
  2. Define a single parameterless private constructor inside the class. It ensures that no instances of this class can be created externally.
  3. Access the class’ singleton instance and public members by calling the Instance property.

I have also included the code in LiquidSilver, which you can view or download from the repository.

Mar 2

LiquidSilver switches to Mercurial on CodePlex

Posted on Tuesday, March 2, 2010 in News, Software

As you may have noticed, CodePlex now supports Mercurial as the source control. Mercurial is a free and distributed version control system. It’s currently gaining a high momentum that big projects like Mozilla, OpenSolaris, OpenOffice.org, Symbian OS, and many others are now using it. Aside from CodePlex, other project hosting sites like Google Code, bitbucket, and SourceForge also offer Mercurial support.

Because DVCS has many advantages over traditional centralized VCS such as Subversion or CVS, I also decided to switch to Mercurial for managing the source code of LiquidSilver.

Setting Up Mercurial on CodePlex

If you’re starting a new project, CodePlex will give you the option to use Mercurial as your version control system. For existing projects, unfortunately, you cannot switch to Mercurial by yourself. Instead, if you are a project owner, you can contact CodePlex using the contact form and tell your intention to switch to Mercurial. Ensure that you’re logged in when doing this and mention your project name, user name, and the email address associated to your user name.

For me, it took less than 24 hours before CodePlex responded to my request and LiquidSilver had been migrated to Mercurial. All the versions and labels were intact and I could clone the repository successfully. Thanks, CodePlex.

Using Mercurial

If you are just starting and not familiar with Mercurial or any DVCS in general, it can be confusing at first since the concept is different. Fortunately, Joel Spolsky has composed a wonderful tutorial site called Hg Init that can very quickly and greatly help you understand DVCS or Mercurial in particular. I highly recommend you to visit it. You can also learn Mercurial from its official learning site or the book.

Although you can use Mercurial entirely from the command line interface, you may find it easier or more comfortable to use TortoiseHg that provides a friendly and familiar (if you have used TortoiseCVS or TortoiseSVN before) interface for Windows users.

Visual Studio users can benefit from VisualHG, a Visual Studio extension that can give you real-time visual status updates on your files from within the Visual Studio Solution Explorer window. VisualHG depends on TortoiseHg to execute the Mercurial commands.

Now, have fun with Mercurial.

Feb 8

Refreshing the LINQ to SQL DataContext by Clearing the Cache

Posted on Monday, February 8, 2010 in Programming

LINQ to SQL DataContext can sometimes be difficult to deal with. Especially when combined with the use of stored procedures. For example, there is a case where I want to delete multiple records with a stored procedure rather than using the LINQ to SQL API for performance reason. After executing the stored procedure, the DataContext is not aware of the changes and still thinks that the entities are still there because the DataContext caches them. Hence, when I try to add another record using the same key, the DataContext throws an exception with the following message:

Cannot add an entity with a key that is already in use.

Logically, I want to refresh the DataContext memory so it will recheck the database. The provided DataContext.Refresh() method requires the original entity set to be sent which can be a problem. I don’t want to query the DataContext for the entities for performance reason, hence the stored procedure is used in the first place. So I have to find another way to refresh the DataContext or clear the cache without relying on the original entity set.

There is no official way to do it, but I stumbled on this blog post telling that there is a DataContext method called ClearCache() that can be used for that purpose. Unfortunately that method has internal modifier so you cannot call it from your code. But with a bit of reflection magic you can borrow the hidden power as follows:

context.GetType().InvokeMember(
	"ClearCache",
	BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
	null, context, null);

After invoking the ClearCache() method, I can now successfully add new entities to the DataContext by reusing the keys from the deleted records.

Jun 20

WSS/SharePoint Extension 1.2 for Visual Studio 2008

Posted on Friday, June 20, 2008 in Programming, Software

Finally it’s out, get it while it’s hot.

Now you SharePoint developers no longer need to hesitate to upgrade to Visual Studio 2008 if you haven’t.

This will greatly help development of SharePoint-based solutions when you’re using Visual Studio 2008 by providing the following features:

Visual Studio 2008 Project Templates

  • Web Part
  • Team Site Definition
  • Blank Site Definition
  • List Definition
  • Empty SharePoint Project

Visual Studio 2008 Item Templates (items that can be added into an existing project)

  • Web Part
  • Custom Field
  • List Definition (with optional Event Receiver)
  • Content Type (with optional Event Receiver
  • Module
  • List Instance
  • List Event Handler
  • Template

SharePoint Solution Generator

  • This stand-alone program generates a Site Definition project from an existing SharePoint site. The program enables developers to use the browser and Microsoft Office SharePoint Designer to customize the content of their sites before creating code by using Visual Studio.

Installing the WSS/SharePoint extension on Windows XP/Vista

If you are using Windows XP/Vista and try to install the extension, it will display the following error:

The product can only be installed if Windows SharePoint Services 3.0 has been installed first.

Instead of replacing your OS with Windows 2003, launching a Virtual PC image preloaded with SharePoint, or trying to install SharePoint on Vista, you can simply create a registry entry to fool the extension installer as if you have installed WSS on your XP/Vista machine. Before following these simple steps, as with any registry modification, do so with caution at your own risk. You can create a registry backup if necessary.

Basically — under the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0 registry key — you need to add the following string value: Sharepoint="Installed".

Here is the step-by-step instruction:

  1. Run regedit from command prompt or Start > Run.
  2. Navigate to HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0.
  3. If you cannot find the “12.0″ folder, right click on the Web Server Extensions, select New > Key from the popup menu, and enter 12.0 as the new key name.
  4. Right click the “12.0″ key/folder, select New > String Value from the popup menu, and enter Sharepoint as the name.
  5. Double click the newly created Sharepoint entry, and enter Installed as the value data.
  6. Now you can try to install the Sharepoint extension for VS 2008.

An easier way to do the above steps is to download the SharePointOnXP.reg file, extract, double click on the file. Then you can try to install the extension.

By the way, if you haven’t done so, you might also want to add SharePoint’s dlls to the GAC. Hence, Visual Studio won’t find troubles when compiling your SharePoint-based projects.

Nov 10

Five Things Today’s IT Workers Must Do

Posted on Friday, November 10, 2006 in News

Bill Gates said the West is lacking talented IT workers. Representing the East, India is also heading towards a severe shortage of highly-skilled IT manpower. So now there is a great and broad chance for you, who live and breathe IT, to fill the gaps.

But keep in mind, that what the world is lacking is highly-talented IT workers, not average or even below average ones. Hence you must prepare and build yourself to be outstanding so the world chooses you.

Here are five quick tips for you so you won’t be just another IT worker:

1. Get Updated

The word “information” in IT is there for a reason. IT evolves very quickly. Things you learn today may be obsolete tomorrow. That’s why you must always update yourself with new information, knowledge, and skills if you want to keep up with others in IT industry.

2. Get Certified

You have built solutions in .NET Framework for 5 years. You think you are already a .NET expert, but does the market think so too? Larger companies usually recruit only certified workers. Some companies don’t ask if you are a graduate of Harvard, but they do ask if are a certified Java developer. Get certified and you will likely find your value much higher than before.

3. Get Connected

Gone are the days when a programmer sat in the corner, facing only his monitor and keyboard, typing cryptic codes only a computer could understand. Now you might still sit in the corner, facing your monitor and keyboard, but you must not only type cryptic codes. Instead get connected to other people. Share your knowledge, receive others. Today there are many ways to get connected even if you are not physically in touch. Online chatting, forums, blogs, wikis, and telephones to name a few.
Humans are social-beings. Naturally they enjoy doing things with others. Being an IT worker shouldn’t make you a nerd. Meeting other people lets you learn more and opens even more opportunities.

4. Predict the Market

Face it, there are way so many information and knowledge related to IT you won’t be able to digest them all even if you learn 24/7. Who cares if you are an ultra fast learner and able to learn at least 1 new technology everyday. There will be hundreds more the next day.

So be wise, learn only things you will need. Or better, learn only things the market will need. There are many languages to code in .NET: VB.NET, C#, Managed C++, J#, A#, APL, Chrome, NetCobol, F#, KPL, DotLisp, Ruby.NET, etc. Do you have to master them all? Will people seek you because you know a lot of programming languages? Predict the market. Find out what the market needs today or will need tomorrow. Master it and you will find yourself most welcomed.

5. Open Your Mind

Just because you are a developer in Microsoft platform doesn’t mean you only need to know the solution offered by Microsoft. There are a swarm of other vendors and technologies out there for you to explore. A vendor may be good in providing business solutions, but not in technical or other solutions. You can develop a solution using Oracle backend, Microsoft .NET framework as a frontend, and Linux in the middle for example. Do not limit yourself to certain vendor or technology. Your vendor and technology today might die tomorrow. And it is not uncommon in the IT industry.

Open your mind to innovation too. You don’t always have to think the way other people thinking. Think differently. Create new thinks. You could be the next Linus, Rasmus, Larry, or Bill, who knows.

Also open your mind to the world outside IT. Learn business, management, psychology, art, design or whatever knowledge relevant to what you want to achieve in the future. If you are a programmer but you don’t enjoy your job, don’t push yourself. Move to something else. You don’t have to make a radical maneuver. If you still want to be in IT industry but you hate coding, you can be a system analyst or database administrator for example. Or if you have a good managerial or business skill you can apply for a managerial position instead.

Enough for the tips, next things you will need are the perfect opportunity and a good luck.