65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 XML 动态加载对象 – 第二部分

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2011 年 7 月 1 日

CPOL

1分钟阅读

viewsIcon

15881

downloadIcon

200

在“使用 XML 动态加载对象”的第二部分中,我创建了一个自定义的依赖注入框架。

目标

在这篇文章中,我尝试扩展我在 第一部分 中解释的内容。

目标是设计一个自定义的依赖注入框架。我个人很喜欢 Unity 框架所做的事情。但我希望自己完成这项工作。

让我们开始吧。

承接第一部分,我做的第一步是对代码进行了一些重构。这只是让代码更具可读性和效率。

然后,我在解决方案中添加一个类库项目,并将其命名为 DI。 让我们删除随其创建的类。

我将 Container 类从现有项目移动到 DI 项目。

我构建 DI 项目并添加对 XMLReader 项目的引用。

现在我的解决方案如下所示

DynamicLoading_XML_Part2/image001.jpg

Container 类的代码如下所示

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;
      }
    }
}

正如大家所见,这次我使用了

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

这是因为我试图从另一个类程序集访问 XML。我们不能将 XML 移动到另一个程序集,因为 XML 是用户配置的一部分,应该始终驻留在客户端。

差不多就是这样了。

XMlReader 程序集中的 Class A 没有变化... 我只是从 XMlReader 程序集中的 Program 类中删除了不必要的语句。

XMLReader Program 类的代码如下所示

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();
        }
    }
}

最后,让我们运行我们的 XMLReader 项目。

DynamicLoading_XML_Part2/image002.jpg

© . All rights reserved.