在我们开发一些管理软件中有可能实现邮件和消息的同时发送,我就把最近写的代码整理了一下。
一:
接口的实现代码:
//
声明用于处理发送消息初始化的委托
public delegate void SendMsgInitEventHandler( int iThreadIndex);
/**/ /// <summary>
/// 定义用于反射工厂的接口
/// </summary>
public interface ISend
{
/**//// <summary>
/// 定义属性,用来返回用户登录是否成功
/// </summary>
bool IsLogin
{get ;set ;}
/**//// <summary>
/// 初始化程序
/// </summary>
/// <param name="handler">SendMsgInitEventHandler是事件句柄</param>
void Init(SendMsgInitEventHandler handler, int initEventsIndex);
/**//// <summary>
/// 发送消息的方法
/// </summary>
/// <param name="sendTo">发送消息的地址</param>
/// <param name="strSubject">发送消息的主题</param>
/// <param name="strBody">发送消息的内容</param>
/// <param name="strUrl">连接地址</param>
/// <param name="strDesc">连接地址的描述</param>
/// <param name="strNick"></param>
void Send(object obj);
/**//// <summary>
/// 定义发送消息的初始化事件
/// </summary>
event SendMsgInitEventHandler SendMsgInitEvent;
}
public delegate void SendMsgInitEventHandler( int iThreadIndex);
/**/ /// <summary>
/// 定义用于反射工厂的接口
/// </summary>
public interface ISend
{
/**//// <summary>
/// 定义属性,用来返回用户登录是否成功
/// </summary>
bool IsLogin
{get ;set ;}
/**//// <summary>
/// 初始化程序
/// </summary>
/// <param name="handler">SendMsgInitEventHandler是事件句柄</param>
void Init(SendMsgInitEventHandler handler, int initEventsIndex);
/**//// <summary>
/// 发送消息的方法
/// </summary>
/// <param name="sendTo">发送消息的地址</param>
/// <param name="strSubject">发送消息的主题</param>
/// <param name="strBody">发送消息的内容</param>
/// <param name="strUrl">连接地址</param>
/// <param name="strDesc">连接地址的描述</param>
/// <param name="strNick"></param>
void Send(object obj);
/**//// <summary>
/// 定义发送消息的初始化事件
/// </summary>
event SendMsgInitEventHandler SendMsgInitEvent;
}
二:
反射工厂的实现:
/**/
/// <summary>
/// 定义工厂类,通过反射得到类型
/// </summary>
public class SendFactory
{
/**//// <summary>
/// 返回通过反射得到的类型
/// </summary>
/// <param name="strDll">程序集的名字</param>
/// <param name="strName">程序集中的类名</param>
/// <returns>返回接口</returns>
public ISend[] Make()
{
ConfigInfo cfgInfo = (ConfigInfo)ConfigurationManager.GetSection("Send");
ObjectInfo info ;
ISend[] temp = new ISend[cfgInfo.Count];
for (int i = 0; i < cfgInfo.Count;i++ )
{
info = (ObjectInfo)cfgInfo.Objects[i];
Assembly assembly = Assembly.LoadFrom(info.assemblyName);
Type type = assembly.GetType(info.typeName);
temp[i] = (ISend)Activator.CreateInstance(type, true);
}
return temp;
}
}
/// 定义工厂类,通过反射得到类型
/// </summary>
public class SendFactory
{
/**//// <summary>
/// 返回通过反射得到的类型
/// </summary>
/// <param name="strDll">程序集的名字</param>
/// <param name="strName">程序集中的类名</param>
/// <returns>返回接口</returns>
public ISend[] Make()
{
ConfigInfo cfgInfo = (ConfigInfo)ConfigurationManager.GetSection("Send");
ObjectInfo info ;
ISend[] temp = new ISend[cfgInfo.Count];
for (int i = 0; i < cfgInfo.Count;i++ )
{
info = (ObjectInfo)cfgInfo.Objects[i];
Assembly assembly = Assembly.LoadFrom(info.assemblyName);
Type type = assembly.GetType(info.typeName);
temp[i] = (ISend)Activator.CreateInstance(type, true);
}
return temp;
}
}
三:
创建自定义配置节类:
主要是实现IConfigurationSectionHandler接口,代码如下:
public
class
ConfigHandler : IConfigurationSectionHandler
{
IConfigurationSectionHandler 成员#region IConfigurationSectionHandler 成员
public object Create(object parent, object configContext, System.Xml.XmlNode section)
{
ObjectInfo info;
ConfigInfo cfgInfo = new ConfigInfo();
foreach (XmlNode node in section.ChildNodes)
{
if (XmlNodeType.Comment == node.NodeType) continue;
info = new ObjectInfo();
info.name = node.Attributes["name"].Value;
info.assemblyName = node.Attributes["assembly"].Value;
info.typeName = node.Attributes["typeName"].Value;
cfgInfo.Objects.Add(info);
}
return cfgInfo;
}
#endregion
}
public class ConfigInfo
{
public ArrayList Objects = new ArrayList();
public int Count
{
get { return Objects.Count; }
}
//public ObjectInfo FindByName(string name)
//{
// foreach (ObjectInfo o in Objects)
// {
// if (o.name == name)
// return o;
// }
// return null;
//}
}
public class ObjectInfo
{
public string name;
public string assemblyName;
public string typeName;
}
{
IConfigurationSectionHandler 成员#region IConfigurationSectionHandler 成员
public object Create(object parent, object configContext, System.Xml.XmlNode section)
{
ObjectInfo info;
ConfigInfo cfgInfo = new ConfigInfo();
foreach (XmlNode node in section.ChildNodes)
{
if (XmlNodeType.Comment == node.NodeType) continue;
info = new ObjectInfo();
info.name = node.Attributes["name"].Value;
info.assemblyName = node.Attributes["assembly"].Value;
info.typeName = node.Attributes["typeName"].Value;
cfgInfo.Objects.Add(info);
}
return cfgInfo;
}
#endregion
}
public class ConfigInfo
{
public ArrayList Objects = new ArrayList();
public int Count
{
get { return Objects.Count; }
}
//public ObjectInfo FindByName(string name)
//{
// foreach (ObjectInfo o in Objects)
// {
// if (o.name == name)
// return o;
// }
// return null;
//}
}
public class ObjectInfo
{
public string name;
public string assemblyName;
public string typeName;
}
以下是配置文件的内容:
<
configSections
>
< section name ="Send" type ="命名空间.ConfigHandler,Reflect" />
</ configSections >
<!-- 反射工厂程序集和类型配置文件 -->
< Send >
< add name ="SendMail" assembly ="..\..\..\SendMail\Bin\Debug\SendMail.dll" typeName ="命名空间.Mail" />
< add name ="SendMessage" assembly ="..\..\..\SendMessage\Bin\Debug\SendMessage.dll" typeName ="命名空间.Message" />
</ Send >
由于本人文采不是太好,写的不是很详细望大家谅解!!
< section name ="Send" type ="命名空间.ConfigHandler,Reflect" />
</ configSections >
<!-- 反射工厂程序集和类型配置文件 -->
< Send >
< add name ="SendMail" assembly ="..\..\..\SendMail\Bin\Debug\SendMail.dll" typeName ="命名空间.Mail" />
< add name ="SendMessage" assembly ="..\..\..\SendMessage\Bin\Debug\SendMessage.dll" typeName ="命名空间.Message" />
</ Send >