.NET 插件系统框架设计(一)框架整体构想
来源:互联网 发布:纪录片《国殇》知乎 编辑:程序博客网 时间:2024/05/22 01:27
设计阶段一:将接口定义成单独程序集,让插件去实现这个接口,框架采用反射来完成子插件功能的读取。
问题:
1. 要定义若干接口。
2. 对于现在已存的模块修改太大。
设计阶段二:着力于对第一阶段第二个问题解决,在协议接口和插件间添加一个适配器,有了这样的结构,就能将现有已存在模块方便地与主机框架整合
设计阶段三:在阶段二的启发下,解决在阶段一中的要事先定义若定义接口的问题。改进,在接口协议与主机框架间加适器,让接口协议义与主机开发断开
问题:插件与协议,主机-协议藕合较大。适配器操作麻烦。
阶段四:框架完善:在阶段三的基本上,插件及主机本身实现也预定义接口(视图),通过这一框架设计,主机系统及插件可以互不干扰地开发(为方便后期整合,插件及主机开发均定义成接口),开发完成后只需要添加一个接口协议及两人适配器就完成了主机与插件整合。
插件获取主程序数据
解决方案分组项目名称说明ContractCodemarks.Framework.Plugin.Contract程序集间协议 AddIn SideCodemarks.Framework.Plugin.View.User插件功能接口定义AddIn SideCodemarks.Framework.Plugin.Adapter.User插件类适配器AddIn SideCodemarks.Framework.Plugin.AddIn.User用户插件类具体实现AddIn SideCodemarks.Framework.Plugin.Addin.Model主机操作实现类 Host SideCodemarks.Framework.Plugin.Host.View.User主机功能接口定义Host SideCodemarks.Framework.Plugin.Host.Adapter.User主机协议适配器Host SideCodemarks.Framework.Plugin.Host.User用户插件类具体实现Host SideCodemarks.Framework.Plugin.Host.Model用户插件实体()在这个插件框架中,主要解决的问题为主机与插件相互通信,比如在日志插件中会验证用户是否有发表权限,日志插件并不会直去访问用户中心插件,而是向主机请求(如图),而主机在接受到请求后会调用用户中心插件,完成日志插件所请求的功能。在插件与主机的数据通信中主要有两和上操作:
1. 主机获取插件数据:如日志中请求用户请求用户权限数据。
2. 插件获取主机数据,如日志插件请求用户数据,主机将会通过反射创建用户对象返回供日志插件用。
主机插件关系图
日志插件请求用户数据
项目分析:
Contract项目:
事先定义插件与主机交互协议,定义接口IUserContract IUserInfo(实体类) 两个接口,
IUserContract 继承于IContract 预留接口(负责插件程序生命周期及权限相关接口)
IUsercontract 接口定义方法添加用户方法
Bool AddUser(IUserInfo userInfo) IUserInfo
GetUserInfoByName(string userName);
AddIn Sider结构
插件程序只需实现协议中所定义的方法,这样就能适现主机与插件的通信,为了方便后期整合,插件系统本身的功能我们先定义接口,1 2 3 项目并没有跟协义没有关系。
1AddIn SideCodemarks.Framework.Plugin.View.User用户插件功能接口定义2AddIn SideCodemarks.Framework.Plugin.AddIn.User用户插件类具体实现3AddIn SideCodemarks.Framework.Plugin.Addin.Model主机操作实现类4AddIn SideCodemarks.Framework.Plugin.Adapter.User插件类适配器//插件中的自定义实体类
//插件中UserView插件中功能接口
//用户件中UserView接口具体实现
以上代码为独立代码与接口协议没有关系
//适配器实现接口协议IUserContract 中的AddUser(IUserInfo) 与GetUserInfoByName();
在主机请求添加用户时会传入一个IUserInfo 接口,而在用户插件需求参数为CustomUserInfo 参数类型不同,在GetUserInfoByName(string userName) 返回值为ICustomUserInfo ,我们在适配器类中实现CustomUserInfo 到UserInfo 转换 及UserInfo到CustomUserInfo 转换
public interface UserView
{
CustomUserInfo GetUserInfoByName(string userName);
int AddUser(CustomUserInfo userInfo);
}
//插件实现类转化为协议类
定义CustomUserInfoToContractAdapter实现接口协议IUserInfo接口
定义 private CustomUserInfo addIn;通过构程函数进行赋值,在Name get 属性时返回addIn.Name;
Set 方法同理
/// <summary>
/// 从自定义实体转为协议
/// </summary>
internal class CustomUserInfoToContractAdapter : IUserInfo
{
private CustomUserInfo addIn;
public CustomUserInfoToContractAdapter(CustomUserInfo customUserInfo)
{
this.addIn = customUserInfo;
}
#region IUserInfo 成员
public string Name
{ get{return addIn.Name;}
Set{}
}
…其它属性
#endregion
}
//插件实现类转化为协议类
定义ContractTCustomUserInfoAdapter继承于插件实体类CustomUserInfo,定义 private IUserInfo contract;通过构造函数进行contract 赋值,在Name get 属性时return contract.Name;
internal class ContractToCuntomUserInfoAdapter : CustomUserInfo
{
private IUserInfo contract;
public ContractToCuntomUserInfoAdapter(IUserInfo iuserInfo)
{
this.contract = iuserInfo;
}
#region CumtomUserInfo Member
public override string Name
{
get { return contract.Name; }
set { base.Name = value; }
}
}
//UserInfoAdapter实体类适配器
/// <summary>
/// 协议与插件实体类互转适配器集合
/// </summary>
public class UserInfoAdapters
{
public static IUserInfo ContractToAddIn(CustomUserInfo customUserInfo)
{
return new CustomUserInfoToContractAdapter(customUserInfo); //调用转换类
}
public static CustomUserInfo AddInToContract(IUserInfo iuserInfo)
{
return new ContractToCuntomUserInfoAdapter(iuserInfo);
}
}
//UserAdapter类
public class UserAdapter : IUserContract
{
private cn.CodeMarks.Framework.Plugin.View.UserView view = null;
public UserAdapter()
{
this.view = new UserAddIn();
}
public UserAdapter(UserView userView)
{
this.view = userView;//创建插件具体实现
}
#region IUserContract 成员
/// <summary>
/// 根据用户名返回用户对象
/// </summary>
/// <param name="userName"></param>
/// <returns></returns>
public cn.CodeMarks.Framework.Plugin.Contract.Entity.IUserInfo GetUserInfoByName(string userName)
{
通过用户名查用户对象CustomUserInfo 转换为IUserInfo 接口
return UserInfoAdapters.ContractToAddIn(view.GetUserInfoByName(userName));
}
public int AddUser(IUserInfo userInfo)
{
return view.AddUser(UserInfoAdapters.AddInToContract(userInfo));
}
#endregion
}
主机请求插件数据时序图
- .NET 插件系统框架设计(一)框架整体构想
- 程序框架构想(一)
- 企业信息化框架设计构想
- 测试监控系统框架构想
- 实现Android网络框架:(一)整体设计
- Spring 框架学习(一):设计理念、整体架构
- Mybatis整体框架设计
- Net分布式系统之一:系统整体框架介绍
- .NET 插件系统框架设计(二) 使用对象序列化实现自定义配置文件管理
- Spring框架系列(一)-整体架构
- spring源码剖析(一)整体 框架
- 基于.net的可扩展框架设计 - 整体架构
- 推荐系统的整体框架
- V4L2 driver(一). 整体框架
- EJB 验证框架 构想
- 快速开发框架构想
- BootStrap--整体框架--JavaScript插件架构
- .net 框架设计 签名系统三层架构
- 风谷の思念
- Fedora 15/16 安装后需要做的28件事
- JAVA设计模式十二--State(状态模式)
- 人人都是产品经理。到200页记录。
- oracle习题带答案
- .NET 插件系统框架设计(一)框架整体构想
- 文件同步系统 DRBD
- 2012年6月21日记--主题迷茫
- 类型转换&&类型强制转换
- .NET 插件系统框架设计(二) 使用对象序列化实现自定义配置文件管理
- Stanford 算法入门 week1 algorithm for closest pair
- 放假回家
- 写给.NET程序员:不要困在自己建造的盒子里
- JNI学习之-----Local and Global References