C# 静态工厂利用反射机制动态构建配置文件中所配置的类的对象
在产品项目进行中我们难免会遇到因为项目服务对象不同,实现也不同的功能。
这样每次修改后重新编译整个解决方案后更新耗时耗力。
其实使用静态工厂,我们可以很容易的引入额外的dll来动态的配置这些功能的实现
首先下面是所有工厂的基类,其中包含了一个读取配置文件的方法,和一个生成对象的静态方法
代码
/// <summary>
/// 所有工厂基类
///<author name="Jan.David"></author>
///<![CDATA[2010-11-05]]>
/// </summary>public abstract class AbstractFactory
{
/// <summary>
/// 读取设置文件内的值
/// </summary>
/// <param name="parentNode"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string ReadSettring(string parentNode,string key)
{
string FilePath = AppDomain.CurrentDomain.BaseDirectory;//项目路径
//新建xml文档对象
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
//读取文档
doc.Load(FilePath + "/Setting.xml");
//获取根节点
System.Xml.XmlNodeList Root = doc.FirstChild.NextSibling.ChildNodes;
System.Xml.XmlNodeList nodes = default(System.Xml.XmlNodeList);
foreach (System.Xml.XmlNode node in Root)
{
if (node.Name.ToLower() == parentNode.ToLower())
{
nodes = node.ChildNodes;
break;
}
}
if (nodes != null && nodes.Count > 0)
{
foreach (System.Xml.XmlNode node in nodes)
{
if (node.Attributes["name"].Value.ToLower() == key.ToLower())
{
return node.Attributes["value"].Value;
}
}
}
return null;
}
/// <summary>
/// 实例化一个对象
/// </summary>
/// <typeparam name="T">要实例化的类型</typeparam>
/// <param name="ClassName">需要实例化的类名</param>
/// <param name="obj">实例化对象存储的变量</param>
public abstract void CreateInstanc<T>(string className,ref T obj);
}
下面是具体的实现
代码
class BillCodeFactory : AbstractFactory
{
#region 属性
private static string RETURNS = ReadSettring("BillCode""Returns");//销售退货
#endregion
/// <summary>
/// 实例化一个对象
/// </summary>
/// <typeparam name="T">要实例化的类型</typeparam>
/// <param name="ClassName">需要实例化的类名</param>
/// <param name="obj">实例化对象存储的变量</param>
public override void CreateInstanc<T>(string className, ref T obj)
{
obj = (T)System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(className, false);
}
public string Returns
{
get
{
return ReadSettring("BillCode""Returns");
}
}
}
配置文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<BillCode>
<add name="Returns" value ="IBillCodeImplt.Returns"></add>
</BillCode>
</configuration>