DM
新增/修改Message(New)
先淺談新架構
參考DM Server設計
新架構的一支Message會這樣執行
每一支Message就是一個class
(擁有自己的資料與函數)
查詢KDataObject
新增資料到KDataObject
修改資料到KDataObject
組Xml
Message特有的邏輯才會直接寫在這
新架構的一支Message會這樣執行
(MessageId = ModuleName_MessageName) 沒有Request/Reply的字
直接找MessageId.h/.cpp
MessageId.h
#ifndef MessageId_H
#define MessageId_H
#include "...h"
class ServiceKernel;
class MessageId : public KMessageProcessorBase
{
public:
MessageId(ServiceKernel* m_ServiceKernel, string m_ChannelId, string m_MessageId,
KFabLinkMessageType m_MessageType, bool m_IsMonitor,
KFabLinkTransaction& m_Transaction); //建構式
virtual void MessageLogic(); //執行Message的邏輯函數
};
#endif
MessageId.cpp
建構式
MessageId::MessageId (...):
KMessageProcessorBase(m_ServiceKernel, m_ChannelId, m_MessageId, m_MessageType, m_IsMonitor,
m_Transaction)
{
} 執行父類別中有
參數的建構式
MessageId.cpp
執行Message的邏輯函數(Query)
void MessageId::MessageLogic()
{
//do any thing
}
MessageId.cpp
執行Message的邏輯函數(非Query)
void MessageId::MessageLogic()
{
KDoTransaction transaction; //KDo要加入交易才可以寫入資料庫
try{
//do any thing
if (!transaction.Commit()){
throw FablinkException(ERROR_FABLINK_TRANSACTION_COMMIT_FALSE);
}
}
catch (...){
transaction.Rollback();
throw;
}
} 捕捉到任何錯誤
都執行Rollback
並把錯誤再往外拋
若交易Commit出錯,拋出
ERROR_FABLINK_TRANSACTION_COMMIT_FALSE
找找
實作檔案
Visual Studio 2005的Solution Explorer
Visual Studio 2005的Solution Explorer
DMServer>ConstDefine
SuMsgErrorCode.h/.cpp error code的宣告與定義(與新架構共用)
DMServer>ConstDefine>FablinkKgs
fKDataTime 特別為Fablink加強的KDataTime版本(與新架構共用)
fSysUtils 特別為Fablink加強的SysUtils版本(與新架構共用)
Visual Studio 2005的Solution Explorer
DMServer>Impl>Others
FablinkCriticalSection.h 會自動解鎖的CriticalSection
FablinkException.h/.cpp 新架構執行出問題拋出exception的指定類型
FilePathConfig.h/.cpp config檔案的一切
KDoTransaction.h/.cpp 為了接近.dll檔的寫法重包一次的交易物件
Visual Studio 2005的Solution Explorer
DMServer>Impl>objMessage
MainObj 代理資料表的類別, 通常名稱是TableName1.h/.cpp
MsgObjs Message類別MessageId.h/.cpp
(MessageId = ModuleName_MessageName) 沒有Request/Reply的字
KMessageProcessorBase.h/.cpp Message共用的Interface
MessageProcessorFactory.h/.cpp Message的工廠模式
(用message id換message object的地方)
新增
Message
步驟
分兩種
Query和其它
新增Message
DMServer>Impl>objMessage>Msg
Objs>Reply
依分類增加一個Dm要回Reply的
Message檔案
先不用寫do any thing。
DMServer>Impl>objMessage>MsgObjs>MessageObjects.h
加上#include "MessageId.h"
DMServer>Impl>objMessage> MessageProcessorFactory.cpp
加上ADD_MESSAGE_FUNCTION_MAP(MessageId);
第一次,先測試!!
執行!!
測試是否會執行到剛剛新增的檔
案裡。
不行要檢查剛剛的步驟是否正確
(注意Request的後綴)
寫邏輯
修改Message
void MessageId::MessageLogic()
{
//do any thing
}
先想想, 剛剛被畫掉的
• 查詢KDataObject
• 新增資料到KDataObject
• 修改資料到KDataObject
• 刪除KDataObject
• 組KDataObject的Xml
• 物件邏輯
(工序加報工機、機加到工作中心、報的項目要連動…)
發現了嗎?
都和KDataObject有關
邏輯可能存在任何的Message
所以應該是這樣?
class KDoOrganization : public KDataPersistentObject
{
public:
//member value
string Id;
string Name;
public:
KDoEmployee* GetCoBoss();
void SetCoBoss( KDoEmployee* m_Object);
public:
//member function
void DeleteAllWorkCenterEmpRelation();
void DeleteAllOrgEmpRelation();
EmployeeList1 GetEmployeesInOrganization() const;
public:
KXmlItem GetXml_OrganizationInfo(const string& m_InfoName) const;
}
但是…
無法直接修改KDataObject
因為它是工具生成的。
所有的修改都必將在下一次全部消失。
剛剛那樣,就GG了
該Table(語意上)所屬的功能, 歸該Table所有
使用上又不增加太多的複雜度呢?
如何用程式語言, 解決這個問題呢?
借鏡Proxy Pattern
obj->Id; //呼叫KDoObject的value(Id)
obj->Function(); //呼叫KDoObject的funciton
obj.Function(); //呼叫TableObject1的funciton
設計成這樣
就可以解決, 剛剛被畫掉的
• 查詢KDataObject
• 新增/修改/刪除KDataObject
• 組KDataObject的Xml
• 物件邏輯
(工序加報工機、機加到工作中心、報的項目要連動…)
查詢KDataObject
查詢唯一值
class Organization1 : public KDoProxy1
{
public:
Organization1(const string& m_Id, unsigned int m_ActiveFlagType, KDoTransaction* const m_Transaction = 0);
Organization1(const string& m_SystemKey, KDoTransaction* const m_Transaction = 0);
Organization1(KDoTransaction* const m_Transaction = 0);
Organization1(KDoOrganization* m_KDataObject, KDoTransaction* const m_Transaction = 0);
//...
}
其它常用查詢
class OrganizationList1
{
public:
OrganizationList1(const string& m_Id, unsigned int m_ActiveFlagType, KDoTransaction* const m_Transaction = 0);
OrganizationList1(list<string>& m_IdList, unsigned int m_ActiveFlagType);
OrganizationList1(list<string>& m_SystemKeyList, KDoTransaction* const m_Transaction = 0);
OrganizationList1(const FilterType& m_FilterType, QueryByPaging1& m_Filter, KDoTransaction* const m_Transaction = 0);
OrganizationList1(unsigned int m_ActiveFlagType);
OrganizationList1(list<KDoOrganization*>& m_List);
//…
}
新增/修改/刪除KDataObject
class Organization1 : public KDoProxy1
{
public:
void CreateToTable(KXmlItem& m_XmlInfo);
void ModifyToTable(KXmlItem& m_XmlInfo);
void ModifyToDelete();
//...
}
class OrganizationList1
{
public:
void DeleteList();
//…
}
組KDataObject的Xml
class Organization1 : public KDoProxy1
{
private:
KXmlItem GetXml_Leader3() const;
KXmlItem GetXml_Leader6() const;
public:
KXmlItem GetXml_OrganizationInfo(const string& m_InfoName = "OrganizationInfo") const;
KXmlItem GetXml_OrgInfo_Leader3(const string& m_InfoName = "OrgInfo") const;
KXmlItem GetXml_OrgInfo_Leader6(const string& m_InfoName = "OrgInfo") const;
//...
}
class OrganizationList1
{
public:
KXmlItem GetXml_OrganizationList(const string& m_ListName, const string& m_InfoName) const;
KXmlItem GetXml_OrgList_v1(const string& m_ListName, const string& m_InfoName) const;
//…
}
物件邏輯
class Organization1 : public KDoProxy1
{
public:
void DeleteAllWorkCenterEmpRelation();
void DeleteAllOrgEmpRelation();
EmployeeList1 GetEmployeesInOrganization() const;
//...
}
class OrganizationList1
{
public:
const unsigned int& Size() const;
bool In( const Organization1& m_Obj ) const;
//…
}
剩下的要靠程式設計師判斷
邏輯的歸類
畫面邏輯
Table邏輯
Message邏輯

Dm create message new