Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / XML

Dynamic Loading of Objects using XML - Part 2

5.00/5 (1 vote)
1 Jul 2011CPOL1 min read 15.5K   181  
In Part 2 of Dynamic Loading of objects, I have created a custom Dependency Injection Framework

Objective

In this post, I try to extend what I explained in Part 1.

The objective is to design a custom Dependency Injection Framework. I personally like what Unity Framework does. But I would like to do the job myself.

Let's get on the job.

Continuing from Part I, the first step I did was do some code refactoring. This just makes the code a bit more readable and efficient.

Then I go ahead and add a class library project to my solution and name it as DI. Let's just delete the class that gets created with it.

I move the Container class from the existing project to the DI project.

I build the DI project and add a reference to the XMLReader project.

Now my solution looks as below:

DynamicLoading_XML_Part2/image001.jpg

Container class is as shown below:

C#
using System;
using System.Xml;
using System.Reflection;

namespace DI
{
  public static  class Container
    {
      public static Type CreateInstance()
      {
          var reader = new XmlTextReader
			(@"C:\Mahadesh\Blogs\SimpleDI\XMLReader\XML\Sample.xml");
          var assem = Assembly.GetCallingAssembly();

          while (reader.Read())
              if (reader.NodeType == XmlNodeType.Element)
              {
                  Type type = null;
                  while (reader.MoveToNextAttribute()) // Read attributes

                      if (reader.Name == "Name")
                      {
                          type = assem.GetType(reader.Value); // typeName is a string
                      }

                  return type;
              }

          reader.Close();
          Console.ReadLine();
          return null;
      }
    }
}

As can be seen, this time around I use:

C#
var assem = Assembly.GetCallingAssembly();  instead of GetExecutingAssembly();

This is because I am trying to access the XML from another class assembly. We cannot move the XML to another assembly since XML is part of the User configuration and should always reside on the client side. GetCallingAssembly() will load the assembly from which the call is being made, which in our case is XMLReader.

Well, that’s pretty much it .

There are no changes to Class A in XMlReader assembly... I have just removed unnecessary statements from the Program class in XMlReader assembly.

The code for the Program class in XMLReader looks as below:

C#
using System;
using DI;

namespace XMLReader
{
    class Program
    {
        static void Main(string[] args)
        {
            var obj = Activator.CreateInstance( Container.CreateInstance());
            var m = Container.CreateInstance().GetMethod("SampleMethod");
            m.Invoke(obj, new Object[] { 42 });
            Console.ReadLine();
        }
    }
}

Finally let's run our XMLReader project.

DynamicLoading_XML_Part2/image002.jpg

License

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