diff --git a/nop-biz/src/main/resources/_vfs/nop/core/model/DictProvider/DictProvider.xbiz b/nop-biz/src/main/resources/_vfs/nop/core/model/DictProvider/DictProvider.xbiz
new file mode 100644
index 000000000..3c8db2ad1
--- /dev/null
+++ b/nop-biz/src/main/resources/_vfs/nop/core/model/DictProvider/DictProvider.xbiz
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/nop-rpc/nop-rpc-api/src/main/java/io/nop/rpc/api/IDynamicRpcService.java b/nop-rpc/nop-rpc-api/src/main/java/io/nop/rpc/api/IDynamicRpcService.java
new file mode 100644
index 000000000..eeb3dbcc2
--- /dev/null
+++ b/nop-rpc/nop-rpc-api/src/main/java/io/nop/rpc/api/IDynamicRpcService.java
@@ -0,0 +1,27 @@
+package io.nop.rpc.api;
+
+import io.nop.api.core.beans.ApiRequest;
+import io.nop.api.core.beans.ApiResponse;
+import io.nop.api.core.beans.FieldSelectionBean;
+import io.nop.api.core.util.ApiHeaders;
+import io.nop.api.core.util.ICancelToken;
+
+import java.util.Map;
+import java.util.concurrent.CompletionStage;
+
+public interface IDynamicRpcService {
+ CompletionStage> dynamicInvokeAsync(ApiRequest> request, ICancelToken cancelToken);
+
+ default CompletionStage> dynamicInvokeWithArgs(
+ String serviceName, String serviceMethod, Map headers,
+ Object data, FieldSelectionBean selection, ICancelToken cancelToken) {
+ ApiRequest