DDD 战略设计实战:3步事件风暴工作坊,产出电商订单域上下文映射图
2026/7/11 16:22:10
原文
在某些情况下,除了运行时库(C++)中提供支持的一些基本类型(bool、short、int、float等)之外,behaviac还支持扩展使用已有的或者用户自定义的类、结构体和枚举类型。
这里有两种情况,其处理方式是不同的:
需要注意的是,behaviac组件为了支持C++的反射系统,对字符串和数组类型有如下要求:
此外,需要对char、signed char和unsigned char做出一些必要的说明:
对于已有的不能修改源码的类型,需要按照如下步骤进行扩展:
在.h文件中,通过宏BEHAVIAC_EXTEND_EXISTING_TYPE特化某个需要的类型。
如下代码样例所示(假设TestNS::Float2是某个第三方库中的类型,需要用到但不能修改它):
BEHAVIAC_EXTEND_EXISTING_TYPE(myFloat2,TestNS::Float2);structmyFloat2{floatx;floaty;DECLARE_BEHAVIAC_STRUCT(myFloat2,false);myFloat2(){}myFloat2(constTestNS::Float2&v):x(v.x),y(v.y){}};namespacebehaviac{// ValueToString & ValueFromStringnamespaceStringUtils{namespacePrivate{template<>inlinebehaviac::stringToString(constTestNS::Float2&val){//myFloat2::ToString is defined by DECLARE_BEHAVIAC_STRUCT(myFloat2)myFloat2temp(val);returntemp.ToString();}template<>inlineboolFromString(constchar*str,TestNS::Float2&val){myFloat2 temp;//myFloat2::FromString is defined by DECLARE_BEHAVIAC_STRUCT(myFloat2)if(temp.FromString(str)){val.x=temp.x;val.y=temp.y;returntrue;}returnfalse;}}}}template<typenameSWAPPER>inlinevoidSwapByteTempl(TestNS::Float2&v){SwapByteTempl<SWAPPER>(v.x);SwapByteTempl<SWAPPER>(v.y);}namespacebehaviac{namespaceDetails{template<>inlineboolEqual(constTestNS::Float2&lhs,constTestNS::Float2&rhs){returnTag::IsEqualWithEpsilon(lhs.x,rhs.x)&&Tag::IsEqualWithEpsilon(lhs.y,rhs.y);}}}behaviac::TypeRegister::Register<TestNS::Float2>("TestNS::Float2");behaviac::TypeRegister::UnRegister<TestNS::Float2>("TestNS::Float2");详细代码可以参考behaviac组件C++源码库中btunittest工程的extendstruct.h文件。