Wednesday, April 29, 2015

On Demand Dependencies in C#

Imagine a situation where you have a business engine that requires different dependencies, such as repositories and services. An easy solution for decoupling these dependencies from the business engine (although a 'business engine' referrers to a class that contains business logic, you could substitute it for any class that requires dependencies for the purpose of this post) would be to employ dependency injection via the constructor. When your business engine only requires a few dependencies, this method works well. However, what about where six dependencies are being injected as illustrated below?

public class MyBusinessEngine
{
    private readonly IDependencyA DependencyA;
    private readonly IDependencyB DependencyB;
    private readonly IDependencyC DependencyC;
    private readonly IDependencyD DependencyD;
    private readonly IDependencyE DependencyE;
    private readonly IDependencyF DependencyF;

    //Constructor injection from IoC
    public MyBusinessEngine(IDependencyA dependencyA, IDependencyB dependencyB, IDependencyC dependencyC,
        IDependencyD dependencyD, IDependencyE dependencyE, IDependencyF dependencyF)
    {
        DependencyA = dependencyA;
        DependencyB = dependencyB;
        DependencyC = dependencyC;
        DependencyD = dependencyD;
        DependencyE = dependencyE;
        DependencyF = dependencyF;
    }

    //Multiple functions that use the above dependencies. 
    //Note that everyone of the methods does not use all of the dependencies; some might use
    //all of them when others might only use a few.
}

With this long list of dependencies, the constructor looks cluttered. In addition, as not all the methods on MyBusinessEngine use all the injected dependencies, resources are being wasted creating them when they aren't going to be needed. There has to be a better way for when you don’t need to inject the kitchen sink!

Resolve dependencies on demand:

public class MyBusinessEngine
{
    public MyBusinessEngine()
    {
    }

    public void SomeMethod()
    {
        var dependencyA = MyContainer.Container.GetInstance<IDependencyA>();
        var dependencyD = MyContainer.Container.GetInstance<IDependencyD>();

        //...
    }
}

Dependencies are no longer injected, but are resolved as they are needed by requesting them from the IoC container directly. Resources are saved by no longer supplying everything the class could need and only creating when is required by the method being invoked. This is an easy solution to implement, however, it has a serious drawback: the class is now coupled to the IoC container. In order to unit test this class, mocks of the dependencies will need to be registered with the IoC container so they can be resolved at runtime by the class under test. Once again, there must be a better way.

Abstracting the IoC container:

public class MyDependencyResolver : IDependencyResolver
{
    public T GetInstance<T>()
    {
        return MyContainer.Container.GetInstance<T>();
    }
}

public class BusinessEngine
{
    private readonly IDependencyResolver DependencyResolver;

    //Constructor injection of MyDependencyResolver from IoC
    public BusinessEngine(IDependencyResolver dependencyResolver)
    {
        DependencyResolver = dependencyResolver;
    }

    public void SomeMethod()
    {
        var dependencyA = DependencyResolver.GetInstance<IDependencyA>();
        var dependencyD = DependencyResolver.GetInstance<IDependencyD>();

        //...
    }
}

In order to remove the coupling of the business engine with the IoC container, the mechanism for which dependencies are resolved needs to be abstracted. This is achieved by creating a dependency resolver that handles the resolution of dependencies. The business engine no longer cares about how the dependency is created, all it cares about is getting the one it requested. You could move from using StructureMap to Castle Windsor or even newing-up instances directly (which is not recommended) and the business engine would not be affected.

Unit testing for the business engine is now possible though mocking the dependency resolver to return mocks of the dependency that are required for the code under test. This makes testing a lot easier and removes the need for your tests to reference the IoC container.

To limit the objects that can be retrieved from your dependency resolver, you can add a constraint upon the GetInstance method. For example, if you created a resolver for repositories, you could apply this constraint: T GetInstance<T>() where T : class, IRepository. This would ensure that only classes that implement IRepository can be served by this dependency resolver. The only issue with this is that as you are now creating multiple dependency resolvers, you will also be adding additional references to your IoC container throughout your project. Fortunately, there's a better way for doing this too.

Decoupling the IoC Container:

public class MyDependencyResolver : IDependencyResolver
{
    public T GetInstance<T>()
    {
        return ServiceLocator.Current.GetInstance<T>();
    }
}

Through using the Common Service Locator (see my blog post from January), the IoC container is no longer coupled to the dependency resolver. If you wanted to change your IoC container, you can now achieve this by making the change in a single location (MyContainer) and rather than having to update all the dependency resolvers as well. Whereas before your project was heavily coupled to your IoC container, by shifting that coupling to the Common Service Locator, you are now free to change your container with minimal impact.

There's the option to only inject dependency resolvers and then to resolve all other instances upon demand. This would certainly help to keep your constructors short and concise. It would also help with the maintenance of unit tests as you would no longer break your tests the moment you add a new dependency to the constructor. As that new dependency would be supplied from the dependency resolver that's already being injected, no change to the constructors signature would be required.

One last thing to consider is that the service locator pattern hides the context from the IoC container when supplying requested dependencies. In other words, it has no idea about what other dependencies have been requested or what is requesting the dependency. If context is important to your application, then it would be wise to inject directly from the IoC container.

The code for the OnDemandDependencies project can be found on GitHub. I've included an example of how you can unit test a business engine with MSTest and Rhino Mocks and how you can create dependencies that live for the lifetime of a dependency resolver.

Wednesday, April 22, 2015

C# Predicates, some Extention Method goodness and a sprinkling of Generic Methods = DIY LINQ

I was reading an article on .Net Design Patterns in Issue 16 of the Dot Net Curry Magazine where they were describing the Pluggable pattern. This implementation of the pattern used the Predicate type to allow you to pass a predicate expression (a statement that resolves to either true or false) in to a method that totaled up a collection of integers. In the example, a totaling up method used the predicate to determine what values were to be selected from a collection (E.g. only even numbers or numbers greater than five), sum them up and returned the total. This pluggable design allowed you to defer specifying the specific behavior of the totaling up method as you are injecting the value selection criteria into the method. This pattern is very powerful as it allows you to write methods that are concerned with executing a process, whilst not being concerned with the exact details of that process.

This article got me thinking about how LINQ (Language Integrated Query) works under the covers as this process of supplying selection criteria is what is happening here too. After chatting to my brother about his blog post where he set himself the challenge of writing his own implementation of Javascript Promises (it’s very cool--check it out here), this motivated me into setting my own mini challenge: Build my own version of the LINQ Where statement.

Like my brother, I decided to set out some constraints:

  • It should work using a fluent syntax.
  • It should accept a lambda predicate statement as the selector.
  • It should work with all types (not just integers or strings).
Effectively, I was wanting to create something which mirrored LINQ’s Where statement's API as closely as possible.
 

I started by breaking down the task into smaller parts. First I created a “WhereMine” method which accepted an IEnumerable<int> and a Predicate<int> that returned an IEnumerable<int> containing the integers which matched the supplied predicate. This can be seen below:

public static IEnumerable<int> WhereMine(IEnumerable<int> values, 
     Predicate<int> predicate)
{
 IList<int> matchedValues = new List<int>();

 foreach(var value in values)
 {
  if(predicate(value))                
   matchedValues.Add(value);                
 }

 return matchedValues;
}

This step allowed me to verify that the predicate expression was working as I had expected it to by only adding a value to the matchedValues collection if the predicate expression was true.

The WhereMine method was called using the following syntax (Please note, DisplayToConsole() is a helper extension method I wrote to write the contents of an enumerable to the console):


IEnumerable<int> numbers = new[] { 1, 2, 3, 4, 5 };
Console.WriteLine("Numbers:");
numbers.DisplayToConsole();

//Predicate Method
Console.WriteLine("Predicate Method");
Console.WriteLine("Only Even:");
WhereMine(numbers, x => x % 2 == 0).DisplayToConsole();
Console.WriteLine("Greater than 2:");
WhereMine(numbers, x => x > 2).DisplayToConsole();

This generated the following output:


So far so good. Next I created an extension method that extended IEnumerable<int> to help provide a similar fluent syntax to LINQ’s Where API:

public static IEnumerable<int> WhereMine(this IEnumerable<int> values, 
 Predicate<int> predicate)
{
 IList<int> matchedValues = new List<int>();

 foreach(var value in values)
 {
  if (predicate(value))
   matchedValues.Add(value);
 }

 return matchedValues;
}

If you are not familiar with creating your own extension methods, you can see this is accomplished by preceding the type you are extending with the "this" keyword (highlighted above in yellow).

This update allowed me to use my WhereMine filter method using a fluent syntax:

IEnumerable<int> numbers = new[] { 1, 2, 3, 4, 5 };
Console.WriteLine("Numbers:");
numbers.DisplayToConsole();

//Extension Method
Console.WriteLine("Extension Method");
Console.WriteLine("Only odd:");
numbers.WhereMine(x => x % 2 == 1).DisplayToConsole();
Console.WriteLine("Greater than 3 but less than 5");
numbers.WhereMine(x => x > 3 && x < 5).DisplayToConsole();

This generated the following output:


Almost there. The last step was to update it so it worked with all types instead of being limited to a single type as my current implementation was. I achieved this by making my WhereMine extension method a generic extension method using the generic template markers highlighted in yellow below:

public static IEnumerable<T> WhereMine<T>(this IEnumerable<T> values, 
     Predicate<T> predicate)
{
 IList<T> matchedValues = new List<T>();

 foreach(var value in values)
 {
  if (predicate(value))
   matchedValues.Add(value);
 }

 return matchedValues;
}

By making it a generic extension method it was now possible to use the WhereMine extension method to filter collections of different types:

//Generic Extension Method
Console.WriteLine("Generic Extension Method");
Console.WriteLine("Numbers doubles:");
IEnumerable<double> numbersDouble = 
     new[] { 1.5d, 5.6d, 9.9d, 10.8d, 20d };
numbersDouble.DisplayToConsole();
Console.WriteLine("Less than 10");
numbersDouble.WhereMine(x => x < 10).DisplayToConsole();

IEnumerable<string> names = 
     new[] { "Jane", "Steve", "Jack", "Betty", "Bill", "Jenny", "Joseph" };
Console.WriteLine("Names:");
names.DisplayToConsole();
Console.WriteLine("Names that start with 'J':");
names.WhereMine(x => x.StartsWith("J")).DisplayToConsole();
Console.WriteLine("Names that are 5 characters in length:");
names.WhereMine(x => x.Length == 5).DisplayToConsole();
Console.WriteLine("Names that start with 'J' and are longer than 4 chars");
names.WhereMine(x => x.Length > 4)
     .WhereMine(x => x.StartsWith("J"))
     .DisplayToConsole();
// Or could be written as
//names.WhereMine(x => x.Length > 4 && x.StartsWith("J")).DisplayToConsole();

This demonstration uses the same WhereMine extension method to filter an enumerable of doubles and an enumerable of strings generating the following output:


By combining a number of the language features of C#, I was able to achieve my end goal of creating my own filter method like the LINQ Where statement with a similar API. I think of this activity as exploratory coding (or sharpening the saw)--where you are trying to build something with the intention of learning more about the language / framework you are using and not necessarily using the end product. I find this learning process a lot more fun and insightful than simply reading about something in a book or on a website. Building something helps solidify what you have learnt and can identify any misunderstandings or gaps in your knowledge.

You can find a project which contains the above source code here.


Happy exploratory coding!

Wednesday, April 1, 2015

Hello World Podcast

The Hello World podcast is a great way to get to know some of the leading figures in the development / technology arena. Out of all the guests currently interviewed, I had heard of 34 of them already so they are a collection of well-known / influential people. It is also hosted by Shawn Wildermuth whose reputation speaks of quality and you can expect nothing less from this podcast.
 

The podcast format is very much like a light-hearted, fun and friendly conversation between two friends. 

Generally Shawn asks similar questions to each of his guests. Do not let this fool you into thinking it’s just going to be the same thing over and over. Each guest has a very different story to tell (I think even Shawn is surprised by this). It’s also interesting to contrast their career paths and look for similarities to try and gain further insights into the decisions they made that led them to where they are now. Some of the common questions asked include:

  • How did you get into programming / technology?
  • Did you have any key mentors and what did you learn from them?
  • How did you progress you career?
  • Would you change anything if you could go back and do it all again? 

Whilst listening to the podcasts, I noticed a number of common themes between the guests:
  • They have learnt multiple languages (and are still learning more).
  • They have had key mentors but surprisingly the important things they learnt from them were not technology related (E.g. time management, problem solving, communication skills).
  • They have a passion for giving back to the community and helping to mentor the new generation of upcoming developers.

There have been a number of interesting finds too:
  • Quite a few of the guests do not have a Computer Science related degree (or any degree). This should not be viewed as a hindrance to breaking into or progressing in the development industry, even though a good majority of positions request them on the job specification.
  • They have an interesting philosophy when it comes to programming which has made me stop and rethink how I can become a better developer: Do not try to master how to program in a particular language, try to master programming in general.
  • Shifts in technology are not to be feared but should be seen as new opportunities. With the fast rate of change in the technology industry, it’s very easy to feel overwhelmed by the constant change surrounding you. I personally agree with what they are saying and see this as one of the exciting aspects of working with technology--it’s constantly changing so new opportunities are appearing every day.
  • Very surprisingly a number of them feel like frauds sometimes, even though they are leaders in their fields.
  • Some were late comers to development having worked in other industries first so it’s never too late to change careers and become a developer. 

I find it really inspiring to listen to each guest’s story as it’s an insight you rarely get into how they got to where they are now unless you know them personally. Each episode is full of great advice and you finish the episode feeling that you too could become a technologist rock star if you are willing to work at it.

When you next have some free time on your hands, check out the Hello World podcast site. Whilst you are there, listen to a couple of episodes, get to know some of your favorite technologists a bit better and feel inspired in the process.