技术讨论:一个通用的基于网络的插件模型(300分)

M

muhx

Unregistered / Unconfirmed
GUEST, unregistred user!
目标:
1.插件方式
2.基于网络
3.通用,使用这个框架只需要关注自身的业务就可以了,其他的功能框架都能实现
4.易用,几乎不增加使用着的学习成本
讨论一下这样的框架需要实现什么具体的需求;
有什么好的建议?
送分大方,如果大家有好的提议,我可以一直放分到我没分为止。(暂时还有13025分)
 
A

aerobull

Unregistered / Unconfirmed
GUEST, unregistred user!
难。这样的平台现在有好多个。
但是不增加学习语言的成本,却多了一块学习框架跟平台的成本。
还是老话,世上没有免费的午餐,出来混,总是要还的 . :)
 
F

fhli

Unregistered / Unconfirmed
GUEST, unregistred user!
操作系统的驱动程序有类似的功能,那要等你变成老大后
 

踏雪寻梅

Unregistered / Unconfirmed
GUEST, unregistred user!
1.插件管理,要提供统一的接口,成为插件的容器
2.提供统一的网络接口,我感觉最小冗余的接口主要Write(ADate;
ACount: Integer);
和OnRead(ADate;
ACount: Integer;
AConnection)就可以了
3.要有统一的协议生成方式,这是决定是否好用的关键。
要通过简单的方式将客户要传输的东西自动编码,接受后还要自动解码。
XML是个好的方式,但是纯文本的方式浪费了太多网络资源。
纯2进制流最节省网络资源,却不容易理解,要在其中找到平衡
4.提供一些通用的业务供用户使用,比如用户管理、日志管理……
 
B

Buddy.Sun

Unregistered / Unconfirmed
GUEST, unregistred user!
XML虽然通用而且好用,奈何解析效率不高,当大量的数据交互时,对机器(特别是服务器)就有要求了
 
L

luoyanqing119

Unregistered / Unconfirmed
GUEST, unregistred user!
要是这样的系统做出来的话,我们都全部失业了.(技术和解决方案总是充满矛盾的.永远没有百分百的解决方案,所以才有我们这些人)
 
L

lcmlhs

Unregistered / Unconfirmed
GUEST, unregistred user!
帮你顶一下!接个分!
 
M

muhx

Unregistered / Unconfirmed
GUEST, unregistred user!
大家提点自己的建议
我会和我的朋友们试着去做
算是离开Delphi社区留给朋友们的最后一个礼物
另外,如果有可能,在离开陪伴了5年的DelphiBBS之前,希望把我不多的这些分都散去
给需要的朋友们
 
L

luoyanqing119

Unregistered / Unconfirmed
GUEST, unregistred user!
新出的技术层了不穷,一下架构不可能解决所有的问题。在框架上做自定义开发,一.开发成本可能比一般开发还高(企业框架会的人不是很多)
 
W

weic

Unregistered / Unconfirmed
GUEST, unregistred user!
参考一下RemObjects吧。应该和你设想的内容有重合的部分。
 
Z

zxwwen

Unregistered / Unconfirmed
GUEST, unregistred user!
我的目的是想用一个tmp adoquery去更新数据库,因为tmp adoquery是多个表的view,而多个表view,adoquery.post会更新多个tabel,所以用update set ...去更新Table
adod.sql.add(我想动态产生)
如何确定要个field被更改过,我用ados.fields.oldvalue <> ados.fields.value 比较,但这里出现错误.
function Tform1.updatetable(ados:Tadoquery;lcTable:string):Boolean;
var
i:integer;
msql:string;
lnparm:string;
lnkey:variant;
msql1,msql2,msql3:string;
adod:Tadoquery;
// lcold,lcnew:variant;
begin
lnparm:='';
msql:='';
adod:=Tadoquery.Create(nil);
adod.Connection:=form1.ADOConnection1;
adod.Close;
adod.SQL.Clear;
lnkey:=ados.Fields[0].AsInteger;
if (lnkey>0) then
begin
msql1:='update '+lcTable +' set ';
msql2:='';
msql3:='';
for i:=1 to ados.FieldCount-1do
if ((copy(ados.Fields.FieldName,0,2) <> 'tmp') and (ados.Fields.FieldName <> 'iren') and (ados.Fields.FieldName <> 'idate') and (ados.Fields.FieldName <> 'uren') and (ados.Fields.FieldName <> 'udate')) then
begin
if ados.Fields.OldValue<>ados.Fields.Value then
----> ERROR "Invaild variant operation" please help me
msql2:=msql2+ados.Fields.FieldName+'=:'+ados.Fields.FieldName+',';
end;
// end;
msql2:=copy(trim(msql2),0,length(trim(msql2))-1);
if (length(msql2) <> 0) then
begin
msql1:=msql1+msql2+',uren=:uren,udate=:udate where id=:id';
adod.SQL.add(msql1);
for i:=1 to ados.FieldCount-1do
begin
if ((copy(ados.Fields.FieldName,0,2) <> 'tmp') and (ados.Fields.FieldName <> 'iren') and (ados.Fields.FieldName <> 'idate') and (ados.Fields.FieldName <> 'uren') and (ados.Fields.FieldName <> 'udate')) then
begin
if [red]ados.Recordset.Fields.OriginalValue<>ados.Recordset.Fields.Value[/red] then
---
begin
lnparm:=ados.Fields.FieldName ;
adod.Parameters.ParamByName(lnparm).Value:=ados.Fields.Value;
end;
end;

end;
adod.Parameters.ParamByName('uren').Value :='admin';
adod.Parameters.ParamByName('udate').Value:=now();
adod.Parameters.ParamByName('id').value:=ados.Fields[0].Value;
adod.Prepared:=true;
try
adod.ExecSQL;
result:=true;
except
result:=false;
end;
adod.Free;
end;
end
 

踏雪寻梅

Unregistered / Unconfirmed
GUEST, unregistred user!
我对比了一下Delphi和Java
Java十年来的高速增长并奠定了自己的地位,与之相反的是Delphi的持续没落
这和“政治”是有关的,为了对抗MS,大的厂商都走在了一起,支持Java,并推动它前进,而本来气势如虹的Delphi,却因为Borland的三心二意和坐以待毙,空有好技术,却没有好的结果。
其实从Java中可以看到很多Delphi的影子,比如单继承,比如异常的处理,比如类的体系结构,比如设计模式的应用等等……
由于众多大厂商对Java的支持,使得建立在Java基础上的框架层出不穷,给了人们很多取舍的空间,比如重量级的EJB,轻量级的Structs、spring等等。
而Borland却忙着迎合别人,失去自己的特色:要做.Net的一个子集,给Eclipse做插件等等。
既然有人选择了.Net为什么不用纯正的C#而用Delphi.Net?既然有人选择了免费的Eclipse和NetBeans为什么还要昂贵的不知道什么时候就失去支持的Delphi?
不过作为使用Delphi多年的软件从业者,希望在Delphi上也能出现一些易用的好的框架,让轻量级的WinForm业务更容易,让Delphi的生命力更长一些
 
Z

zhousan

Unregistered / Unconfirmed
GUEST, unregistred user!
使用
RemObjects SDK +RemObjectS Hydra 应该可以满足你的要求
 

张辉明

Unregistered / Unconfirmed
GUEST, unregistred user!
也想学习一下。
 
D

Devchenxip

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一个基于bpl的插件框架,可以如以下的操作实现扩展。(本身有一个MIS服务包,实现了用户、角色授权、日志等管理)
3、程序扩展可如下操作:
1)建立一个接口包,如_bl_mybl,这个包中存放了你要实现的业务逻辑接口文件
2)在config.xml中增加配置信息:
<item>
<Name>bl_mybl</Name>
<DisplayName>bl_mybl</DisplayName>
<Description>bl_mybl</Description>
<Version>1.00.00</Version>
<FileName>services/_bl_mybl.bpl</FileName>
<ClassName></ClassName>
<Type>1</Type>
</item>
3)在_bl_mybl包中增加你业务逻辑的接口文件,如:
unit srv_bl_mybl_a;
interface
type
IBLMYBLA = interface
['{2BCA62DF-BF0F-4FFE-AC0F-D7402806D090}']
procedure showA(const OwnerActionName: string);
end;

implementation
end.

4)建立一个实现此业务逻辑的包,如_bl_mybl_a_Impl,这个包中实现上面接口文件中的方法,代码如下:
unit srv_bl_mybl_a_Impl;
interface
uses
Classes, SysUtils, Forms, DB, ComCtrls, Service, srv_mis, srv_bl_mybl_a,
ServiceController;
type
TBLMYBLA = class(TInterfacedPersistent,IBLMYBLA,IService)
private
FServiceController: IServiceController;
FMIS: IMIS;
protected
function getController: IServiceController;
procedure setController(Value: IServiceController);
public
function main: Boolean;
procedure showA(const OwnerActionName: string);
end;

implementation
{ TBLMYBLA }
function TBLMYBLA.main: Boolean;
begin
result:= True;
end;

function TBLMYBLA.getController: IServiceController;
begin
result:= FServiceController;
end;

procedure TBLMYBLA.setController(Value: IServiceController);
begin
FServiceController:= Value;
if FServiceController = nil then
raise exception.Create('必须启动服务控制器');
//
if FServiceController.get('mis') = nil then
raise exception.Create('需要MIS服务支持')
else
FMIS:= FServiceController.get('mis') as IMIS;
end;

procedure TBLMYBLA.showA(const OwnerActionName: string);
begin
// FMIS.initGridDataWindow('表名','窗体类名',OwnerActionName);
// 写上你显示窗体的代码,上面的代码是从MIS包继承的窗体的调用。
end;

initialization
Classes.RegisterClass(TBLMYBLA);
finalization
Classes.UnRegisterClass(TBLMYBLA);
end.
 
D

Devchenxip

Unregistered / Unconfirmed
GUEST, unregistred user!
应该说非常适合于团队合作开发。
大家只要实现IService接口,把自己要实现的业务打包,然后在配置文件中做一些简单的配置即可接入系统。并且为了方便模块的挂接,主窗口也是一个独立的包。其实这样的框架应该还有很大的改进余地,只是一个人业余做这个,很多想法都无法一一实现。

unit Service;
interface
uses
ServiceController;
type
IService = interface
['{446AD75A-0586-41C5-B82B-B2815B66C362}']
function main(): Boolean;
function getController: IServiceController;
procedure setController(Value: IServiceController);
property Controller: IServiceController read getController write setController;
end;

implementation
end.
 
M

madic

Unregistered / Unconfirmed
GUEST, unregistred user!
同意Devchenxip
 
A

aerobull

Unregistered / Unconfirmed
GUEST, unregistred user!
纯粹的技术走不远。
我想两条路子,
第一,你有项目,做这些项目时你就采用自己的方法。
第二,你能拉到赞助,有机构出钱让你可以走一段路,出一些成果。
毕竟自己一个人做框架是不现实的。你总要其他人加入的。
 
B

ball_cao

Unregistered / Unconfirmed
GUEST, unregistred user!
有兴趣的话做一个delphi版本的activeresource吧
delphi的长处是做前台
服务一般是用java或ruby这样的语言开发的
如果做多语言混合开发,做前台的delphi需要有一个类似于activeresource的
无状态连接的,并且可以自动绑定到服务器端数据对象的东西
楼上的朋友谈到了xml的性能问题,xml并不是http协议下传输数据的唯一文本格式,
类似的还有更短小的jason等
我的msn:ball_cao@hotmail.com
 
Y

yeschoto21cn

Unregistered / Unconfirmed
GUEST, unregistred user!
是的,jason真的不错.
 

Similar threads

回复
0
查看
662
不得闲
S
回复
0
查看
741
SUNSTONE的Delphi笔记
S
顶部