Ext
- 扩展点Identity
- 业务身份public interface IPolicy<Ext extends IDomainExtension,Identity extends IIdentity> extends IDomainService
不同于 IIdentityResolver
需要Router
类进行路由,IPolicy
本身已经实现路由,无需定义Router
类
IPolicy
要实现在中台,这体现了"平台强管控"思想,场景的准入规则由中台控制,而不是BP自行控制
很多研发利用Spring
机制,自行实现了路由策略:
interface Policy {
boolean support(Context context);
void execute(Context context);
}
List<Policy> policies; // 通过Spring自动注入
for (Policy policy : policies) {
if (policy.support(context)) {
policy.execute(context);
}
}
这有什么问题?它耦合了(控制逻辑,执行逻辑),丧失了平台强管控.
℗Policy
public class FetchWaybillGatewayPolicy implements IPolicy<IFetchWaybillGatewayExt, ShipmentOrder> {
public static final String ABC = "abc"; // 供扩展点实现类绑定时引用
public static final String Efg = "efg";
public String extensionCode(@NonNull ShipmentOrder identity) {
ShipmentOrderPackContext packContext = identity.inContextOfPack();
if (packContext.needWaybillFromAbc()) {
return ABC;
} else if (packContext.waybillFromEfg()) {
return Efg;
} else {
return null; // 没有任何扩展点实现
}
}
}
℗Extension(code = FetchWaybillGatewayPolicy.ALPHA)
public class FetchWaybillGatewayExtAlpha implements IFetchWaybillGatewayExt {
public List<Waybill> fetchWaybill(ShipmentOrder so, PackBag packBag) {
return null;
}
}
// 预埋
List<Waybill> waybills = DDD.usePolicy(FetchWaybillGatewayPolicy.class, so).fetchWaybill(so, packBag);
if (waybills == null) {
// 没有命中任何扩展点实现,这体现了扩展点的第1个语义:做不做
} else {
// 有扩展点实现,并返回了数据,这体现了扩展点的第2个语义:怎么做
}
限定符和类型 | 方法和说明 |
---|---|
String |
extensionCode(Identity identity)
根据领域模型,定位匹配的扩展点.
|
Copyright © 2020–2023. All rights reserved.