C# 模块化开发技术讨论

gzxchaoren 2012-07-31 05:56:38
请问C#怎么来开发模块化的程序。只想请教大概的原理,谈谈大框架。我觉得是不是用反射和类封装调用还是什么?请老鸟进来讨论!!!
...全文
864 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
fywindy 2014-05-06
  • 打赏
  • 举报
回复
楼主是怎么解决的?
CUIT_IGIS 2012-08-18
  • 打赏
  • 举报
回复
看到你那个头像都恶心,楼主。建议你还是换一个
wlf535944903 2012-08-03
  • 打赏
  • 举报
回复
是啊 不是有MEF么 可以试试的
或者看下这个
插件开发代码
Conmajia 2012-08-03
  • 打赏
  • 举报
回复
MEF吧,.NET4.0自带了。。搜索Managed Extensibility Framework。。或者学习下SharpDevelop的AddInTree插件树原理,用它的core.dll来做。。
wsbd10086 2012-08-03
  • 打赏
  • 举报
回复
设计模式------------桥接
wsbd10086 2012-08-03
  • 打赏
  • 举报
回复
设计模式----桥接
gzxchaoren 2012-08-03
  • 打赏
  • 举报
回复
MEF用的怎么样 有用的实际项目的没 说说
gzxchaoren 2012-08-02
  • 打赏
  • 举报
回复
大侠们 帮忙啊
gzxchaoren 2012-08-02
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

感觉使用MEF甚至是MAF这类比较成熟的解决方案都要比自己做反射要好很多。
[/Quote]
MEF/MAF我不懂 有没有资料给个链接
iyomumx 2012-08-02
  • 打赏
  • 举报
回复
感觉使用MEF甚至是MAF这类比较成熟的解决方案都要比自己做反射要好很多。
gzxchaoren 2012-08-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

楼主的头像,闪的眼都瞎了
[/Quote]
刚注册的时候还是学生 当时不是非主流吗呵呵!!
种草德鲁伊 2012-08-02
  • 打赏
  • 举报
回复
楼主的头像,闪的眼都瞎了
gzxchaoren 2012-08-02
  • 打赏
  • 举报
回复
在线等 大侠们,说说我的这个写法和思路对不对,有没有问题,对二次开发,和添加模块的要求应该改什么?
gzxchaoren 2012-08-02
  • 打赏
  • 举报
回复
求指教!!!!
gzxchaoren 2012-08-02
  • 打赏
  • 举报
回复
我现在做了一个项目 是这样的思路看看对不对,请大侠多多指教。。。
主程序----------------项目sms
反射类----------------sms_a
XXX(不知道改叫什么)----sms_b
数据库操作类-----------sms_d
关于sms_b的接口类------sms_I
数据模型类-------------sms_m
一些公用的方法类--------sms_f

namespace GT_SMS
{
...
this.dataGridView1.DataSource = B_Log.G_Log_SelectAll();
...
}

namespace SMS_B
{
...
/// <summary>
/// 创建数据访问接口
/// </summary>
private static readonly I_Log I = Interface_Assembly.i_log();
/// <summary>
/// 日志所有信息
/// </summary>
/// <returns></returns>
public static DataTable G_Log_SelectAll()
{
return I.G_Log_SelectAll();
}
...
}

namespace SMS_A
{
...
/// <summary>
/// 反射错误类
/// </summary>
/// <returns></returns>
public static I_Error i_error()
{
return (I_Error)Assembly.Load("SMS_D").CreateInstance("SMS_D.D_Error");
}
/// <summary>
/// 反射日志类
/// </summary>
/// <returns></returns>
public static I_Log i_log()
{
return (I_Log)Assembly.Load("SMS_D").CreateInstance("SMS_D.D_Log");
}
...
}

namespace SMS_I
{
...
/// <summary>
/// 查询所有信息
/// </summary>
/// <returns></returns>
DataTable G_Interface_SelectALL();
...
}

namespace SMS_D
{
/// <summary>
/// 日志执行类
/// </summary>
public class D_Log : I_Log
{
/// <summary>
/// 日志所有信息
/// </summary>
/// <returns></returns>
public DataTable G_Log_SelectAll()
{
return SqlHelper.ExecuteDataset(GT_Function.StrCon, "G_Log_SelectAll", null).Tables[0];
}
...
}

namespace SMS_M
{
/// <summary>
/// 日志类
/// </summary>
public class M_Log
{
private int _LId;
private string _Log;
private DateTime _Date;
/// <summary>
/// 日志时间
/// </summary>
public DateTime Date
{
get { return _Date; }
set { _Date = value; }
}
/// <summary>
/// 日志内容
/// </summary>
public string Log
{
get { return _Log; }
set { _Log = value; }
}
...
}
SocketUpEx 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

引用 5 楼 的回复:

interface + xml + 反射
定义好通用的接口,二次开发的用户用xml配置(要事先定义好格式)


我最近想出的办法是把反射要用的类名什么的直接追加到DLL文件后面,反射前先从DLL文件末尾读取,这样就不需要额外的XML等配置文件了,建议你也试试.
[/Quote]

累得慌啊

zypine 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
引用 5 楼 的回复:

interface + xml + 反射
定义好通用的接口,二次开发的用户用xml配置(要事先定义好格式)


我最近想出的办法是把反射要用的类名什么的直接追加到DLL文件后面,反射前先从DLL文件末尾读取,这样就不需要额外的XML等配置文件了,建议你也试试.
[/Quote]

什么情况下需要这么做?
dylike 2012-08-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

interface + xml + 反射
定义好通用的接口,二次开发的用户用xml配置(要事先定义好格式)
[/Quote]

我最近想出的办法是把反射要用的类名什么的直接追加到DLL文件后面,反射前先从DLL文件末尾读取,这样就不需要额外的XML等配置文件了,建议你也试试.
续写经典 2012-08-01
  • 打赏
  • 举报
回复
所谓模块化设计的原理,就是将内部的实现细节封装,只通过一个定义好的接口与外部通讯。作为模块,也不一定要求它是主动的,一样也有被动。因此将COM组件作为一个模块是没有问题的。就面向对象观点来看,一个对象的动作是通过各类消息触发的,有一些对象的动作是被它内部的消息触发(比如这个对象内部有线程),可以说它是主动的,有一些对象的动作只被外部的消息触发。主动的对象常常向其他的对象发送消息,以触发其他对象的动作。

对于中心控制器,可以这样理解,模块是有层次化的,在同一层次而言,模块与它同级别的其他模块之间是相互独立的,但对于上一级别而言,这些模块同属于上一级的一个大模块,大的模块从内部实现的观点看,这些组件之间一定是有关系的,可以用某些组件控制其他组件的运行,同时上一级模块对下一级模块有依赖关系。例如:CPU和内存都是插在主板上的模块,彼此是独立的,你换一个CPU对内存没有影响,但从整个计算机来看,是用CPU控制了内存的存取,就是说从计算机这一模块层次来说,把CPU作为它内部实现种的中央控制器,由它来触发其它组件的动作。
zypine 2012-08-01
  • 打赏
  • 举报
回复
定义接口比如
public interface Ixxx
{
...
...
}

然后在程序中相应的地方使用这个接口,至于接口实例可以如下实现,这样可以让系统支持插件,便于二次开发和功能扩展。实际的应用中如果提供二次开发比如像word那样可以在主程序中挂接二次开发的菜单,那么你可以在接口中定义这些菜单和事件,下面的代码包含了如何将一个dll文件动态的转换为实例,这些代码比较简单,实际应用中可能相对会复杂一些,这要看你需要实现的功能,希望对你有帮助。

这儿读取你所有的二次开发插件,插件后缀名你自己定,实际上就是dll文件
string Files = System.IO.Directory.GetFiles(Path + "\\addin", "*.pug");

foreach (string file in Files)
{
这儿根据文件反射为程序集
Assembly a = System.Reflection.Assembly.LoadFile(file);
if (a != null)
{
Type[] Types = a.GetTypes();
for (int i = 0; i < Types.Length ; i++)
{

查找包含Ixxx接口的type,如果有命名空间则查询的字符串包含命名空间比如:zzz.Ixxx
Type t= Types [i].GetInterface("Ixxx");


这儿的obj就是你的Ixxx接口对象实例。
Ixxx obj = (Ixxx)Activator.CreateInstance(Type);

}

}
}
加载更多回复(8)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧