最近全力投入IBOX的开发,先是做了一个留言的Plugins互动插件,不过发现在插件内调用主站很是麻烦,但是可用.net的反射调用IBOX的主站类库的方法:
IBOX插件是一个独立网站作为IBOX主站的Plugin虚拟目录存在,调用主站Bin内类方法非常不方便,有时候不好和主站交互,如在插件内删除留言的操作我要在IBOX的主站内记录日志,但我又不想把dao、bean重新拷贝一份到插件内来,但发现使用反射可以完美的调用IBOX的主站内任一类库方法,具体实现是通过动态加载IBOX的主站类库程序,动态创建dao、bean类实例,动态调用其方法并可获得返回值,所以IBOX插件网站也能调用IBOX的主站IBOX_DB.dll、IBOX_DL.dll内任一方法,希望下次能用到。
获取主站dao内返回查询泛型列表并绑定到GridView显示:
using System.Reflection;
public partial class Leave_Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//在当前虚拟目录内load主站Bin内类库
Assembly ass = Assembly.LoadFile(Server.MapPath("/Bin/IBOX_DL.dll"));
object obj = ass.CreateInstance("FortuneAge.IBOX_DL.FA_Log_dao");
MethodInfo m = obj.GetType().GetMethod("funcGetLogList", new Type[] { });
object rs = m.Invoke(obj, null);
Response.Write(rs);
GridView1.DataSource = rs;
GridView1.DataBind();
}
}
调用主站dao内添加操作日志的方法:
protected void AddLog(int eventId, string name, string description)
{
Assembly ass = Assembly.LoadFile(Server.MapPath("/Bin/IBOX_DL.dll"));
//创建FA_Log_dao访问数据类实例
object dao = ass.CreateInstance("FortuneAge.IBOX_DL.FA_Log_dao");
Type daoType = dao.GetType();
//创建FA_Log_bean实体类实例
object bean = ass.CreateInstance("FortuneAge.IBOX_DL.FA_Log_bean");
Type beanType = bean.GetType();
beanType.GetProperty("fdLogID").SetValue(bean, daoType.GetMethod("funcNewID").Invoke(dao, null), null);
beanType.GetProperty("fdLogEventID").SetValue(bean, eventId, null);
beanType.GetProperty("fdLogEventName").SetValue(bean, name, null);
beanType.GetProperty("fdLogDescription").SetValue(bean, description, null);
beanType.GetProperty("fdLogCreateAt").SetValue(bean, DateTime.Now, null);
beanType.GetProperty("fdLogIP").SetValue(bean, HttpContext.Current.Request.UserHostAddress, null);
beanType.GetProperty("fdLogUserID").SetValue(bean, LoginUser.UserID, null);
MethodInfo m = daoType.GetMethod("funcInsert", new Type[] { beanType });
//调用funcInsert方法
m.Invoke(dao, new object[] { bean });
}