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





5.00/5 (1投票)
在“使用 XML 动态加载对象”的第二部分中,我创建了一个自定义的依赖注入框架。
目标
在这篇文章中,我尝试扩展我在 第一部分 中解释的内容。
目标是设计一个自定义的依赖注入框架。我个人很喜欢 Unity 框架所做的事情。但我希望自己完成这项工作。
让我们开始吧。
承接第一部分,我做的第一步是对代码进行了一些重构。这只是让代码更具可读性和效率。
然后,我在解决方案中添加一个类库项目,并将其命名为 DI
。 让我们删除随其创建的类。
我将 Container
类从现有项目移动到 DI 项目。
我构建 DI 项目并添加对 XMLReader
项目的引用。
现在我的解决方案如下所示
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
项目。