BizModel中的服务方法可以通过NopGraphQL引擎对外暴露为服务函数,可以通过GraphQL、REST和gRPC等多种方式调用BizModel上的方法。
有的时候在后台集成使用的时候,可能会希望跳过NopGraphQL引擎,直接触发BizModel上的方法,比如说在Spring的工作流步骤中触发。
Nop平台提供了BizActionInvoker这个帮助类,通过它上面的方法来直接调用BizModel。
public class BizActionInvoker {
public static Object invokeActionSync(String bizObjName, String bizAction, Object request, FieldSelectionBean selection, IServiceContext context) { IBizObjectManager bizObjectManager = BeanContainer.getBeanByType(IBizObjectManager.class); IBizObject bizObject = bizObjectManager.getBizObject(bizObjName); GraphQLOperationType opType = bizObject.getOperationType(bizAction); IOrmTemplate ormTemplate = BeanContainer.getBeanByType(IOrmTemplate.class); ITransactionTemplate txnTemplate = BeanContainer.getBeanByType(ITransactionTemplate.class);
return ormTemplate.runInSession(session -> { if (opType == GraphQLOperationType.query) { Object ret = bizObject.invoke(bizAction, request, selection, context); return FutureHelper.getResult(ret); } else { return txnTemplate.runInTransaction(null, TransactionPropagation.REQUIRED, txn -> { Object ret = bizObject.invoke(bizAction, request, selection, context); return FutureHelper.getResult(ret); }); } }); }
public static ApiResponse<?> invokeGraphQLSync(String bizObjName, String bizAction, ApiRequest<?> request) { IGraphQLEngine graphQLEngine = BeanContainer.getBeanByType(IGraphQLEngine.class); IGraphQLExecutionContext gqlCtx = graphQLEngine.newRpcContext(null, bizObjName, request); return graphQLEngine.executeRpc(gqlCtx); } }
|
- invokeActionSync调用会直接触发BizObject上的action,它会转化为对BizModel上方法的调用。这种调用方式与GraphQL调用的区别在于不会对返回结果执行GraphQL Selection处理。