一个三层问题?中间层的问题?(100)

  • 主题发起人 主题发起人 新来的菜鸟
  • 开始时间 开始时间

新来的菜鸟

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一个三层架构程序,但我只是在中间层简单的用了DataSetProvider1来连接,里面没有写任何的逻辑代码!所以说根本就没发挥他中间层的真正作用!我的设想是想把数据库里的所有存储过程都放在中间层里来实现,而数据库不做任何的数据运算只是单单的做一个数据库用,这样才是三层架购的意义!但我不知道如何把存储过程放到中间层里来实现!那位大哥能不能给个简单完整的原代码让我看看呢?小弟在这谢谢了!!Email:yangzongling18@163.com
 
这里如果要合成数据的话你要用到内存数据集
 
里面没有写任何的逻辑代码-->明确地告诉你,这种方法成本最低,效果也行.根本没有必要把逻辑写在中间层.对于企业ERP来说,真正的瓶颈是在数据库的IO读写,而不是逻辑运算,所以,你把逻辑运算拆成多台电脑来负责,是完完全全的小题大作,不做正事!!!!!真正的正事就提高数据库的读写效率.而不是分拆多个中间层这种无聊的事.中间层只是用来实现INTNERT的小道具而已.中间层封装逻辑,只适合那些数据库读写小,但逻辑运算复杂的系统.ERP,进销存,恰恰相反!!!!!!!!!!!!
 
感觉中间层是应该处理一些业务逻辑的,而不是用来处理数据的吧。数据的操作最好还是放在Remote Data Model层来实现。个人浅见。不知道对不对。
 
呵,小弟学习中!!!
 
中间层是可以替代一些存储过程的逻辑判断的,减少事务锁。
 
呵,小弟继续学习中...
 
我也觉得没必要把数据库的业务逻辑放到中间层。 中间层方便管理和处理客户端的信息,不让客户端单独对数据库进行操作就可以了。
 
to zengguocai能举个例子吗?谢谢!
 
哈哈,业务逻辑部件的作用是不需要怀疑的。单就一个业务逻辑过程的数据交换方面的好处来说,业务逻辑部件就有存在的理由,更别说什么系统维护、安全性、产权保护、跨平台等诸多方面带来的益处了。ERP中的业务逻辑是非常复杂的,怎么会很简单?
 
有谁能给个简单的三层业务逻辑方面的例子或是介绍一些书来看看呢?谢谢
 
to wpy020327: erp每个业务逻辑,都有一个IO读写,你要是放在中间层,那不是累死数据库??? 这种情况,应封装在存储过程中. 改起来也方便,也方便各个客户定做.
 
http://m.thebei.cn/2_24_670639.aspx
 
谁能不能举个简单的例子来听听?
 
来自:aKnightChen, 时间:2009-8-5 14:14:05, ID:3970772to wpy020327: erp每个业务逻辑,都有一个IO读写,你要是放在中间层,那不是累死数据库??? 这种情况,应封装在存储过程中. 改起来也方便,也方便各个客户定做. ---------------------难道放客户端时,数据库就不累了?不仅数据库累,网络也累!
 
谁能不能举个简单的例子来听听?
 
转贴点:当有一个新的相对通用的功能需要加入到系统时,可以不重新修改主程序,而是编写一个公用插件挂接到应用服务器即可,如果时间允许,还可以为其设计客户端调用的控件;另外,这种插件机制又是三层架构系统中在应用服务器上封装业务逻辑的重要手段:通过为某些个业务(如交易过程)编写特定的插件,一方面把业务逻辑实现在了插件里,同时,又可以让应用程序通过简单的远过程调用来完成这个业务处理。下面是一个业务逻辑编程例子,实现的是读一个数据集的功能:library ReadCustomers;uses sharemem, SysUtils, Classes, Windows, Provider, dbclient, AdoDB;{$R *.RES}const CAPTUREBLT = $40000000;//// 主函数...function RemoteProcess(AdoConn: TAdoConnection; InText: string; InStream: TMemoryStream; var OutText: string; var OutStream: TMemoryStream): boolean; stdcall;var condition: string; j: integer; SysDataset: TAdoDataset; dp: TDatasetProvider; cds: TClientDataset; ok: boolean;begin//// ----------------------------这里开始写你的程序-----------------------------------------//// 得到条件串... j:=pos(#9,intext); if j>0 then condition:=trim(copy(intext,1,j-1)) else condition:=trim(intext); if Uppercase(condition)='NONE' then condition:='';//// 创建SysDataset对象... SysDataset:=TAdoDataset.Create(nil); SysDataset.Connection:=AdoConn;//// 过滤... if condition='' then SysDataset.CommandText:='SELECT * FROM CUSTOMERS' else SysDataset.CommandText:='SELECT * FROM CUSTOMERS WHERE '+condition; try SysDataset.Active:=true; ok:=true; except ok:=false; end;//// 假如失败,返回... if not ok then begin SysDataset.free; result:=false; exit; end;//// 若成功,数据转储... dp:=TDatasetProvider.Create(nil); cds:=TClientDataset.Create(nil); try dp.DataSet:=SysDataset; cds.Data:=dp.Data; ok:=true; except ok:=false; end;//// 若失败... if not ok then begin cds.free; dp.free; SysDataset.free; result:=false; exit; end;//// 成功,生成输出流... OutStream.Clear; Cds.SaveToStream(OutStream);//// 结束,释放对象... Cds.Free; dp.Free; SysDataset.Free;// ----------------------------你的程序写到这里为止---------------------------------------//// 返回成功代码... result:=true;end;//// 向主程序提供的函数或过程的输出声明...exportsRemoteProcess;//// 初始化代码...begin//end.下面是客户端通过远过程调用(RPC)调用上面的插件的测试程序:unit main;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Grids, DBGrids, SyncBurro, QBConnection, DB, DBClient;type TForm1 = class(TForm) Label1: TLabel; DBGrid1: TDBGrid; Bevel1: TBevel; Label2: TLabel; Edit1: TEdit; Button1: TButton; Button2: TButton; Button3: TButton; QBConnection1: TQBConnection; SyncBurro1: TSyncBurro; DataSource1: TDataSource; ClientDataSet1: TClientDataSet; procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);begin edit1.Text:=''; button1.Enabled:=false; qbconnection1.Connect;end;procedure TForm1.Button3Click(Sender: TObject);begin if syncburro1.UserLogin then button1.Enabled:=true else application.MessageBox('admin登陆失败,无法继续测试!','错误信息',0);end;procedure TForm1.Button1Click(Sender: TObject);var rettext,dataid: string; j: integer;begin syncburro1.TargetDatabase:='testdb'; if syncburro1.SimpRPC(qbconnection1.NodeId,'readcustomers','',trim(edit1.Text)+#9,rettext,j,dataid) then SyncBurro1.ReadDataToCDS(dataid,clientdataset1) else application.MessageBox('远调用ReadCustomers模块失败!','错误信息',0);end;procedure TForm1.Button2Click(Sender: TObject);begin close;end;end.---------------------------------------总结:1、若有业务的实现方法(业务逻辑)改变时,只需要改一下业务逻辑部件模块, 服务端主程序不用再改动2、若接口关系不变,客户端程序也不用修改。3、若把程序的业务逻辑的大部分剥离并以业务逻辑部件方式实现,系统的修改、维护量就很小,且绝大部分情况下,都可以象B/S系统那样,客户端免维护4、通用性的插件编写和使用可以扩充服务端宿主系统的固有功能5、客户端的编程工作量最轻,因为无须处理实现细节
 
多人接受答案了。
 
后退
顶部