CodeCampSA website

Monday, 8 June 2009

I could keep dropping hints waiting for CodeCampSA to get its own site – or I could just go ahead and create it myself!

So, I’m please to announce www.codecampsa.com – the new home of Adelaide’s own .NET Code Camp.

So let’s get the word out amongst Adelaide’s .NET community. Pass the word to your colleagues and developer friends. Tell any higher education or training organisations – what a great way for students to network and make contacts in the industry!

If the name “CodeCamp” puts people off, feel free to call it a “.NET Conference”! In fact call it what ever you like to get people to come along, because once they’re in the door I’m confident they’ll be glad they came.

CodeCampSA 2009

Friday, 5 June 2009

According to an email from ADNUG’s Peter Griffith, Adelaide’s CodeCampSA 2009 will be held on July 18-19th. As in previous years, it will be at UniSA.

I’ve offered to do a talk about Pex. I wouldn’t be surprised to see WPF guru Nigel popping up on the speaker list, and I’ve encouraged Ben and Timothy to think about whether they’d be interested in speaking too.

I still think having a CodeCampSA website would be a great help for promoting the event too.

When PreRelease really means Release

Wednesday, 3 June 2009

Once upon a time, I’d installed the 180-day trial version of SQL Server 2008, and prior to that I’d been running the last CTP.

The expiry time was fast approaching, and I also needed to install the Integration Services components so I figured it might be time to uninstall the trial version and install the proper licensed one instead. The main reason I’d been putting this off was I knew it was going to take a few hours of uninstall/reinstall.

So I uninstalled everything in Add/Remove Programs that looked vaguely related to SQL Server, rebooted, then installed a fresh version….

Only to see “10.0.1600.22 ((SQL_PreRelease).080709-1414 )” in the About box of SQL Server Management Studio.

Hmm.. In desperation I then uninstalled everything vaguely related to Visual Studio 2008, and then tried again…

Same result!

It was only then that I found this post in which I discovered that no, SQL_PreRelease really means RTM!

Oh well, I guess it means my Visual Studio and SQL installs are fresher, but a bit of a pain nonetheless.

"Parameter count mismatch" calling Resolve()

Monday, 1 June 2009

I was seeing this exception being thrown in some code recently:

System.Reflection.TargetParameterCountException: Parameter count mismatch.
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
   at Castle.Core.ReflectionBasedDictionaryAdapter..ctor(Object target)
   at Castle.MicroKernel.DefaultKernel.Resolve[T](Object argumentsAsAnonymousType)

The original source line was something like this:

IDictionary<string, object> args = new Dictionary<string, object>();
args.Add( "paramName", "value" );

_kernel.Resolve<ISomething>( args );

That all looks fine, and let’s assume the Something class has indeed a constructor with a string parameter named ‘paramName’. So why isn’t it working?

I should have noticed the clue[1] in the stack trace, but was sure I had identical code elsewhere that was working correctly, so it had me stumped. It was only after taking a break from the code, then playing around with a very simple test project that I realised that while there is a method Resolve<T>(IDictionary), that’s not the one that was being called here. Why? Because instead of using var, I’d declared the variable to be an IDictionary<string, object> – and surprisingly that interface does not imply you implement IDictionary (the non-generic version).

When I went back and checked other instances of the code that were working, sure enough I was using var and because Dictionary<> does implement both IDictionary<> and IDictionary it was working as expected.

[1] The clue was the type and parameter name for Resolve - “Object argumentsAsAnonymousType” is obviously not the same as IDictionary!

Avoiding static references to an IoC container

Friday, 29 May 2009

It seems quite common for applications to employ a static class to encapsulate the Inversion of Control container. A simple example of such a class might be:

public static class IoC
{
    private static IWindsorContainer _container = new WindsorContainer();

    public static T Resolve<T>()
    {
        return _container.Resolve<T>();
    }
}

While the normal practise would be to inject dependencies through the constructor, there are times where you may need to pass extra arguments as part of the Resolve() method. You might end up with a method such as this:

    public class SomeClass : ISomeClass
    {
        public SomeClass()
        { }

        public void SomeMethod(string name)
        {
            if (name == "david")
            {
                var class1 = IoC.Resolve<IClass1>();
            }
            else
            {
                var class2 = IoC.Resolve<IClass2>();
            }
        }
    }

This works, but because of the tight coupling to the IoC class, it isn’t ideal. It also makes it harder to test as you are going to have to ensure that WindsorContainer gets configured appropriately.

A better solution is to add a dependency in the contructor for IKernel. If this class is resolved via the container, then it will resolve IKernel to a reference of the current Windsor MicroKernel object (which WindsorContainer inherits from). You can then use the reference to kernel to call its Resolve() method. Having the kernel injected now means it is now elementary to pass in a mock in your test code, mitigating the need to have all your castle.config configuration for your unit tests.

public class SomeClass : ISomeClass
{
    private IKernel _kernel;
    public SomeClass(IKernel kernel)
    { 
        _kernel = kernel;
    }

    public void SomeMethod(string name)
    {
        if (name == "david")
        {
            var class1 = _kernel.Resolve<IClass1>();
        }
        else
        {
            var class2 = _kernel.Resolve<IClass2>();
        }
    }
}