有关三层中如何用COM封装商业逻辑(300分)

  • 主题发起人 主题发起人 microding
  • 开始时间 开始时间
M

microding

Unregistered / Unconfirmed
GUEST, unregistred user!
有那高手能系统的讲一讲,有关三层中如何用COM封装商业逻辑,有范例更佳,可另加300分。
 
看看李维的书,又点
 
我认为所谓的商业逻辑不要封装在COM中,除非需要析大量数据,在数据库中存贮过程中处理又比较麻烦的。
你想一想,一个逻辑即要从数据库读取数据,又要返回给客户端,岂不麻烦?
如果数据在客户端已有,就在客户端处理,多方便;
如果还要从数据库读取数据,如果是大量的,就在数据库中处理完后,通过COM组件再传给客户端,不就完了。
当然,如果你用的是ACCESS等桌面数据库,在数据库中不能写过程,那本来应该放在数据库
端处理的逻辑只能放在中间层了。还有就是在数据库的
 
偶来了 :)
看偶以前回答的问题就知道大概的答案了 :)
 
商业逻辑就是你在系统中应用的业务逻辑,即处理业务流程所要遵循的企业规则,在C/S结构下这些规则大部分写在客户端,变动较频繁的写在服务器端,这样只要企业的业务规则发
生变更就需要修改客户端,或服务器端,或都修改,这样对于系统版本的易管理性和可移植
性就带来的问题,三层架构推荐程序员尽量把业务逻辑写在中间层,即封装在COM/COM+里,这样在业务规则发生变更时,只需要修改中间层的COM就可以了,这样易于对客户端的版本进行管理,同时也提高了数据库的可移植性;
 
to :liwens:
能举个实际生活中用COM来实现的例子吗,附上代码更佳(600分给你)
 
这是偶以前回答的一个问题里面的源码,呵呵,就是建表和删除表的,你看看吧。
这样避免了数据服务器与事物处理器所结合而带来的低效率问题。
写中间层规则也就是写用户的函数或者方法接口,尽量的把用户经常需要的函数或者查询写在
中间层,这样避免了网络通讯的数据量大的问题。
unit Uit_NumPlan;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComServ, ComObj, VCLCom, StdVcl, bdemts, DataBkr, DBClient,
MtsRdm, Mtx, NumPlan_TLB, Provider, DB, ADODB;
type
TMST_NumPlan = class(TMtsDataModule, IMST_NumPlan)
Adc_Numplan: TADOConnection;
Adq_NumPlan: TADOQuery;
Dsp_NumPlan: TDataSetProvider;
private
{ Private declarations }
protected
class procedure UpdateRegistry(Register: Boolean;
const ClassID, ProgID: string);
override;
procedure sAddTable(var sTableName: OleVariant);
safecall;
procedure sDropTable(var sTableName: OleVariant);
safecall;
public
{ Public declarations }
end;

var
MST_NumPlan: TMST_NumPlan;
implementation
{$R *.DFM}
class procedure TMST_NumPlan.UpdateRegistry(Register: Boolean;
const ClassID, ProgID: string);
begin
if Register then
begin
inherited UpdateRegistry(Register, ClassID, ProgID);
EnableSocketTransport(ClassID);
EnableWebTransport(ClassID);
end else
begin
DisableSocketTransport(ClassID);
DisableWebTransport(ClassID);
inherited UpdateRegistry(Register, ClassID, ProgID);
end;
end;

procedure TMST_NumPlan.sAddTable(var sTableName: OleVariant);
var
sSQL : String;
begin
//检测是否存在表
sSQL := 'SELECT name FROM sysobjects WHERE rtrim(name)='''+sTableName+'''';
Try
With Adq_NumPlando
begin
Close;
SQL.Clear;
SQL.Add(sSQL);
Prepared;
Open;
//如果不存在,则建立,并设置主键与默认值
if Adq_NumPlan.RecordCount = 0 then
begin
Close;
sSQL := 'CREATE TABLE [dbo].['+sTableName+'] ('
+'[f_ibusnoid] [int] NOT NULL ,'
+'[f_iseatid] [int] NOT NULL ,'
+'[f_cvseatnu] [char] (4) COLLATE Chinese_PRC_BIN NOT NULL ,'
+'[f_cuserid] [char] (6) COLLATE Chinese_PRC_BIN NULL ,'
+'[f_ctickstatu] [char] (1) COLLATE Chinese_PRC_BIN NULL ,'
+'[f_istatorder0] [int] NULL ,'
+'[f_istatorder1] [int] NOT NULL'
+'[f_dtgq] [datetime] NULL,'
+') ON [PRIMARY]';
SQL.Clear;
SQL.Add(sSQL);
ExecSQL;
Close;
sSQL := 'ALTER TABLE [dbo].['+sTableName+'] WITH NOCHECK ADD'
+' CONSTRAINT [PK_'+sTableName+'] PRIMARY KEY CLUSTERED'
+' ('
+' [f_ibusnoid],'
+' [f_iseatid]'
+' ) ON [PRIMARY]';
SQL.Clear;
SQL.Add(sSQL);
ExecSQL;
Close;
sSQL := 'ALTER TABLE [dbo].['+sTableName+'] WITH NOCHECK ADD'
+' CONSTRAINT [DF_'+sTableName+'_f_ctickstatu] DEFAULT ('
+'0'
+') FOR [f_ctickstatu],'
+' CONSTRAINT [DF_'+sTableName+'_f_istatorder0] DEFAULT (1) FOR [f_istatorder0],'
+' CONSTRAINT [DF_'+sTableName+'_f_istatorder1] DEFAULT (99) FOR [f_istatorder1]';
Close;
SQL.Clear;
SQL.Add(sSQL);
ExecSQL;
end;
end;
except
on Exceptiondo
begin
SetAbort;
Raise;
end;
end;
end;

procedure TMST_NumPlan.sDropTable(var sTableName: OleVariant);
var
sSQL : String;
begin
Try
With Adq_NumPlando
begin
sSQL := 'DROP TABLE '+sTableName;
Close;
SQL.Clear;
SQL.Add(sSQL);
ExecSQL;
end;
except
on Exceptiondo
begin
SetAbort;
Raise;
end;
end;
end;

initialization
TComponentFactory.Create(ComServer, TMST_NumPlan,
Class_MST_NumPlan, ciMultiInstance, tmApartment);
end.

这只是其中的两个接口而已。
一个是建表,一个是删表,看了就应该有点头绪了。
 
to 阿西喊佛
建表删表的过程放在数据库中,在客户端直接调用过程,岂不痛快?
 
那还叫三层?两层的肯定比三层的痛快
 
用多了救知道了[:D]
 
暂给 阿西喊佛,余下300下次给。
 

Similar threads

D
回复
0
查看
928
DelphiTeacher的专栏
D
D
回复
0
查看
882
DelphiTeacher的专栏
D
D
回复
0
查看
855
DelphiTeacher的专栏
D
后退
顶部