Dynamic Loading of Objects Using XML: Part 2


Objective of this article:

In this article I try to extend what I explained in the Part 1 posted here

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 with the job.

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

Then I went ahead and added a class library project to my solution and I named it DI. Let's just delete the class that was 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:

Dynamic1.gif


The Container class is as shown below:

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:

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


This is because I am trying to access the XML from another class assembly. We can not 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 the XMlReader assembly. I have just removed unnecessary statements from the Program class in the XMlReader assembly.

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

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.

Dynamic2.gif


Similar Articles