发送邮件和消息接口的实现(一)接口与反射
在我们开发一些管理软件中有可能实现邮件和消息的同时发送,我就把最近写的代码整理了一下。
一:
接口的实现代码:
//声明用于处理发送消息初始化的委托
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 成员
}
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 成员
}
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>