NET插件系统框架设计.docx

上传人:b****8 文档编号:28277023 上传时间:2023-07-10 格式:DOCX 页数:11 大小:285KB
下载 相关 举报
NET插件系统框架设计.docx_第1页
第1页 / 共11页
NET插件系统框架设计.docx_第2页
第2页 / 共11页
NET插件系统框架设计.docx_第3页
第3页 / 共11页
NET插件系统框架设计.docx_第4页
第4页 / 共11页
NET插件系统框架设计.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

NET插件系统框架设计.docx

《NET插件系统框架设计.docx》由会员分享,可在线阅读,更多相关《NET插件系统框架设计.docx(11页珍藏版)》请在冰豆网上搜索。

NET插件系统框架设计.docx

NET插件系统框架设计

设计阶段一:

将接口定义成单独程序集,让插件去实现这个接口,框架采用反射来完成子插件功能的读取。

  

  问题:

  1.要定义若干接口。

  2.对于现在已存的模块修改太大。

  设计阶段二:

着力于对第一阶段第二个问题解决,在协议接口和插件间添加一个适配器,有了这样的结构,就能将现有已存在模块方便地与主机框架整合

  

  设计阶段三:

在阶段二的启发下,解决在阶段一中的要事先定义若定义接口的问题。

改进,在接口协议与主机框架间加适器,让接口协议义与主机开发断开

  

  问题:

插件与协议,主机-协议藕合较大。

适配器操作麻烦。

  阶段四:

框架完善:

在阶段三的基本上,插件及主机本身实现也预定义接口(视图),通过这一框架设计,主机系统及插件可以互不干扰地开发(为方便后期整合,插件及主机开发均定义成接口),开发完成后只需要添加一个接口协议及两人适配器就完成了主机与插件整合。

  

  插件获取主程序数据

  

  解决方案分组  项目名称  说明

  Contract  Codemarks.Framework.Plugin.Contract  程序集间协议

  AddInSide  Codemarks.Framework.Plugin.View.User  插件功能接口定义

  AddInSide  Codemarks.Framework.Plugin.Adapter.User  插件类适配器

  AddInSide  Codemarks.Framework.Plugin.AddIn.User  用户插件类具体实现

  AddInSide  Codemarks.Framework.Plugin.Addin.Model  主机操作实现类

  HostSide  Codemarks.Framework.Plugin.Host.View.User  主机功能接口定义

  HostSide  Codemarks.Framework.Plugin.Host.Adapter.User  主机协议适配器

  HostSide  Codemarks.Framework.Plugin.Host.User  用户插件类具体实现

  HostSide  Codemarks.Framework.Plugin.Host.Model  用户插件实体()

  在这个插件框架中,主要解决的问题为主机与插件相互通信,比如在日志插件中会验证用户是否有发表权限,日志插件并不会直去访问用户中心插件,而是向主机请求(如图),而主机在接受到请求后会调用用户中心插件,完成日志插件所请求的功能。

在插件与主机的数据通信中主要有两和上操作:

  1.主机获取插件数据:

如日志中请求用户请求用户权限数据。

  2.插件获取主机数据,如日志插件请求用户数据,主机将会通过反射创建用户对象返回供日志插件用。

  

  主机插件关系图

  

  日志插件请求用户数据

  项目分析:

  Contract项目:

  

  事先定义插件与主机交互协议,定义接口IUserContractIUserInfo(实体类)两个接口,

  IUserContract继承于IContract预留接口(负责插件程序生命周期及权限相关接口)

  IUsercontract接口定义方法添加用户方法

Bool AddUser(IUserInfo userInfo) IUserInfo

  GetUserInfoByName(string userName);

AddInSider结构

  插件程序只需实现协议中所定义的方法,这样就能适现主机与插件的通信,为了方便后期整合,插件系统本身的功能我们先定义接口,123项目并没有跟协义没有关系。

  1  AddInSide  Codemarks.Framework.Plugin.View.User  用户插件功能接口定义

  2  AddInSide  Codemarks.Framework.Plugin.AddIn.User  用户插件类具体实现

  3  AddInSide  Codemarks.Framework.Plugin.Addin.Model  主机操作实现类

  4  AddInSide  Codemarks.Framework.Plugin.Adapter.User  插件类适配器

  

  //插件中的自定义实体类

  

  //插件中UserView插件中功能接口

  

  //用户件中UserView接口具体实现

  

  以上代码为独立代码与接口协议没有关系

  //适配器实现接口协议IUserContract中的AddUser(IUserInfo)与GetUserInfoByName();

  

  在主机请求添加用户时会传入一个IUserInfo接口,而在用户插件需求参数为CustomUserInfo参数类型不同,在GetUserInfoByName(stringuserName)返回值为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 方法同理

  /// 

  /// 从自定义实体转为协议

  /// 

  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实体类适配器

  /// 

  /// 协议与插件实体类互转适配器集合

  /// 

  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 成员

  /// 

  /// 根据用户名返回用户对象

  /// 

  /// 

  /// 

  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

  }

  主机请求插件数据时序图

  

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 军事政治

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1