关于MTS组件的开发与调用问题(100分)

  • 主题发起人 主题发起人 巴蒂斯图塔
  • 开始时间 开始时间

巴蒂斯图塔

Unregistered / Unconfirmed
GUEST, unregistred user!
根据三层结构的建模方式,为了能重复使用,在Data Services先根据各实体
来建立EO,我的理解就是建立一个MTS DataModule组件,在该组件里通过
在Type Liabary里建立多个Method,如Add(),Delete().....等,
在Business Services建立BO时,只是分别调用EO里面的功能,
我的理解是建立一个MTS Object 组件,在组件里再通过Uses
TLB文件的方式,用类似于
try
if Assigned(ObjectContext) then
begin
OleCheck(ObjectContext.CreateInstance(CLASS_Co_GrpUser,
IID_ICo_GrpUser, IMtsrvo));
//生成EO的实例
Result:=IMtsrvo.UpGrpUser(Delta,MaxErrors,ErrorCount);
//调用Eo的方法
end;
ObjectContext.SetComplete;
except
ObjectContext.SetAbort;
end;

的方式来调用EO的方法
但在建立客户端应用程序时,发现SocketConnect里只能显示EO的服务名,
不能显示BO的服务名,所以只能通过以下的方式来调用BO的服务
var
iRecord:Integer;
IMtso:IcoBus_cx;
begin
try
IMtso:=CocoBus_cx.CreateRemote('R-d-server');
If ClientDataSet1.ChangeCount>0 then
IMtso.UpGrpUser(ClientDataSet1.Delta,0,iRecord);
IMTSo:=nil;
end;
end;

在本机上运行时正常,在别的机器上时先要用RegSrv32先对该DLL注册,否则会
弹出"Interface not Support"的错误信息。
请问这种建立MTS程序的方式是否正确?这种必须先在客户端注册服务程序的方式如果使用
了多个DLL维护量很大,是否有更好的方式?请各位老大不吝指教
 
我也很喜欢巴蒂的冲天豪气和他的巴蒂GOAL!!
但是对你的问题,我只能悄悄的表示我的关注……
 
ok,我再帮你把问题往上提。
 
在客户端注册服务程序的方式已经解决,如果是win2000的话,大家可以看一看组件服务器
里的帮助文档,其实对于NT4.0也是一样的做法,就是把package组件包导成一个服务器代理
文件XX.msi,在客户端上运行一遍就可以了,注意如果是用Windows 2000打包,则非2000的
客户端需要安装Windows Installer,可以
到http://msdn.microsoft.com/downloads/sdks/platform/wininst.asp下载。
至于建MTS组件的方法,我用这种方式做了一些程序,感觉似乎没什么问题,只是没有高
手来验证这种方式对与否,觉得有些底气不足,还请各位该出手时就出手,
意甲就要开打了,我巴蒂希望能多多进球,以谢球迷和东家

 
我不是很同意巴蒂的说法。
如果按你的说法来做的话,你的BO只是一个协调者,你的EO才是
你的业务规则的核心。也就是说,你的EO才是BO。
还有,在多层应用中,虽然有一定的模式,但是在实际应用中会应为
可扩展性或性能等各种因数会有各种不同的实现方法并不拘泥于一种固定的模式。
 
顺便问一下:如何把package组件包导成一个服务器代理文件XX.msi
我觉得巴蒂的作法是对的。
 
对于一个企业级应用来说,针对于不同的职能单位,有不同的实体存在,
完成各自的功能,它是实体对象。对于一个企业来说,它的运作流程将是
在它的商业逻辑层中实现。只有这样,才能达到比较好的柔软性。
一个职能单位的变化将只改变其实体对象,而一个企业的业务流程的变化将在
商业逻辑层中进行。
 
hongjiang先生,非也非也,您误解我的意思了,我的BO并不是EO,
简单举个例子,EO就是所谓的物理实体,象比较常见的库存管理,
填写一个入库单,在输入单据后,要求同时要更改仓库里的货品数量,
对于这个简单的操作,由于涉及到了两个不同的数据表,一个是入库单,
一个是仓库货品数量,每个数据表都对应着一个EO,也就是用了两个
mts data module来分别处理它们的新增、修改和删除等操作,
假设入库单的EO里有这么一个方法:
  InStock.Append():用来实现新增入库单
而仓库货品数量的EO里有这么一个方法:
  stock.upShopCount():用来修改货品数量
这时所谓的业务规则应该是在BO里来进行实现,在这个BO中,可以定义
一个方法:bus.UpStock
这个方法的写法就类似于
try
  startTransaction.....启动事务
Instock.Append()
stock.UpShopcount()
SetComplete;
except
SetAbort;
.....
end
而如果进行销售开单时,也同样要修改仓库的货品数量,这个时侯
另外一个BO,需要调用到可能就是
outstock.Append();
Stock.UpshopCount()
在这里可以看到,EO其实只包含了最基本的操作,而BO则是商业规则,
可以无限地扩展和重复调用EO
以上个人观点,欢迎高手们指正
 
很高兴您们能关注这个问题
对于把包做成msi文件,其实只要打开组件服务器,在要打包的package上
按右键,选择“导出...”即可,如果是要在98上调用,则选择导出成“应用程序代理”,
如果要在别的服务器上安装此组件,则选择“服务器应用程序”选项
 
对不起,是我理解错了。
 
这种方法就是在库结构复杂的时候传递参数比较多而且麻烦。
例如一个Master-Detial形式的数据插入操作,参数传递就比较麻烦。
因为要在COM中传递自定义的类比较麻烦(听说可以实现,但是我还没有做成功)
所以BO的功能转到客户端做可能比较方便,省去数据传来传去的麻烦。
现在我发现这样做好像不是太稳定,有时可以保存成功,有时又不行,而且还不出错!
不知道是为什么,大家讨论讨论。
 
其实省事点的办法不用一个个参数传递,只要定义一个Olevariant类型的参数就可以了,
传进来的是Delta数据类型资料,当然这种方式会比一个一个参数的方法增加了一定量的
网络传输流量
比如保存一个表,只需要三个参数,delta,maxErrors(最大错误量),还有一个错
误数量的Input/OutPut参数,由对应adodataset的TProvider来做数据提交的工作
function Todb_ClassA.UpData(Delta: OleVariant;
MaxErrors: Integer;
var ErrorCount: Integer): OleVariant;
begin
try
Result:=dspClassA.ApplyUpdates(Delta,MaxErrors,ErrorCount);
SetComplete;
except
SetAbort;
end;
end;
在前端调用时一般可以这么写
procedure TDm_ZA6.SaveDelta;
var
iRec:integer;
begin
try
IMtso:=Coobus_Basic.CreateRemote(remoteserverName);
if cdsItem.ChangeCount>0 then
cdsItem.Reconcile(IMtso.UpData(cdsItem.Delta,0,iRec));
finally
IMtso:=nil;
end;
end;
在cdsItem这个clientDataset的onReconcileError事件里加入一句话:
procedure TDm_ZA6.cdsItemReconcileError(DataSet: TClientDataSet;
E: EReconcileError;
UpdateKind: TUpdateKind;
var Action: TReconcileAction);
begin
HandleReconcileError(DataSet,UpdateKind,E);
end;
这样当数据保存出错时会弹出一个错误提示窗体
另外,如果对于主从表,也可以用这种方式,只要在后台用两个adoDataSet控件
设置好主从对应关系就可以了,在取数据到前端时可以同时把主从表的数据提取到
前端,而数据提交时一样可以这么做,我已经在项目中这么使用过了,没有任何的
问题。
个人观点,希望高手们指教

 
在这里发个言,可以收到高手的话,没有人反对吧,等我成了高手,我再做大侠
 
请问能给解释以下 BO EO好吗???
 
对于EO和BO,在李维的<<分布式多层应用系统篇>>一书第四章里已经说得很详细了
企业对象(Business Object-BO)分为功能对象(functional Object-FO),数据对象
(Data Object-DO)以及实体对象(Entity Object-EO)
功能对象FO依据它的功能又可以细分为控制对象(Control Object-CO),协调对象
(Coordinator Object-CRO),交易对象(Transaction Object-TO)
象我们在这里讨论的所谓EO,BO只是一个懒人的说法,EO主要指和数据库打交道的部分,
BO则泛指应用中间层
 
请问MTS在客户端如何控制事务?比如如何让ClientdataSet.applyupdates(-1)之后回退?
 
巴蒂斯图塔:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
You can control Transaction by ITransactionContextEx Interface at client.
Such as this example in delphi help:
procedure TForm1.MoveMoneyClick(Sender: TObject);
begin
Transfer(CLASS_AccountA, CLASS_AccountB, 100);
end;
procedure TForm1.Transfer(DebitAccountId, CreditAccountId: TGuid;
Amount: Currency);
var
TransactionContextEx: ITransactionContextEx;
CreditAccountIntf, DebitAccountIntf: IAccount;
begin
TransactionContextEx := CreateTransactionContextEx;
try
OleCheck(TransactionContextEx.CreateInstance(DebitAccountId,
IAccount, DebitAccountIntf));
OleCheck(TransactionContextEx.CreateInstance(CreditAccountId,
IAccount, CreditAccountIntf));
DebitAccountIntf.Debit(Amount);
CreditAccountIntf.Credit(Amount);
except
TransactionContextEx.Abort;
raise;
end;
TransactionContextEx.Commit;
end;
 
后退
顶部