This is an automated email from the ASF dual-hosted git repository.

xuanwo pushed a commit to branch xuanwo/ctor-service-init
in repository https://gitbox.apache.org/repos/asf/opendal.git

commit f3dfc01055466889e033ee10279ab20a92f706fd
Author: Xuanwo <[email protected]>
AuthorDate: Thu Dec 4 19:37:28 2025 +0800

    refactor: Register service at build time instead
    
    Signed-off-by: Xuanwo <[email protected]>
---
 core/Cargo.lock                                |  32 ++++++
 core/core/Cargo.toml                           |   1 +
 core/core/src/docs/rfcs/6828_core.md           |   2 +-
 core/core/src/services/aliyun_drive/mod.rs     |   7 ++
 core/core/src/services/alluxio/mod.rs          |   7 ++
 core/core/src/services/azblob/mod.rs           |   7 ++
 core/core/src/services/azdls/mod.rs            |   7 ++
 core/core/src/services/azfile/mod.rs           |   7 ++
 core/core/src/services/b2/mod.rs               |   7 ++
 core/core/src/services/cacache/mod.rs          |   7 ++
 core/core/src/services/cloudflare_kv/mod.rs    |   7 ++
 core/core/src/services/compfs/mod.rs           |   7 ++
 core/core/src/services/cos/mod.rs              |   7 ++
 core/core/src/services/d1/mod.rs               |   7 ++
 core/core/src/services/dashmap/mod.rs          |   7 ++
 core/core/src/services/dbfs/mod.rs             |   7 ++
 core/core/src/services/dropbox/mod.rs          |   7 ++
 core/core/src/services/etcd/mod.rs             |   7 ++
 core/core/src/services/foundationdb/mod.rs     |   7 ++
 core/core/src/services/fs/mod.rs               |   7 ++
 core/core/src/services/ftp/mod.rs              |   7 ++
 core/core/src/services/gcs/mod.rs              |   7 ++
 core/core/src/services/gdrive/mod.rs           |   7 ++
 core/core/src/services/ghac/mod.rs             |   7 ++
 core/core/src/services/github/mod.rs           |   7 ++
 core/core/src/services/gridfs/mod.rs           |   7 ++
 core/core/src/services/hdfs/mod.rs             |   7 ++
 core/core/src/services/hdfs_native/mod.rs      |   7 ++
 core/core/src/services/http/mod.rs             |   7 ++
 core/core/src/services/huggingface/mod.rs      |   7 ++
 core/core/src/services/ipfs/mod.rs             |   7 ++
 core/core/src/services/ipmfs/mod.rs            |   7 ++
 core/core/src/services/koofr/mod.rs            |   7 ++
 core/core/src/services/lakefs/mod.rs           |   7 ++
 core/core/src/services/memcached/mod.rs        |   7 ++
 core/core/src/services/memory/mod.rs           |   7 ++
 core/core/src/services/mini_moka/mod.rs        |   7 ++
 core/core/src/services/moka/mod.rs             |   7 ++
 core/core/src/services/mongodb/mod.rs          |   7 ++
 core/core/src/services/monoiofs/mod.rs         |   7 ++
 core/core/src/services/mysql/mod.rs            |   7 ++
 core/core/src/services/obs/mod.rs              |   7 ++
 core/core/src/services/onedrive/mod.rs         |   7 ++
 core/core/src/services/oss/mod.rs              |   7 ++
 core/core/src/services/pcloud/mod.rs           |   7 ++
 core/core/src/services/persy/mod.rs            |   7 ++
 core/core/src/services/postgresql/mod.rs       |   7 ++
 core/core/src/services/redb/mod.rs             |   7 ++
 core/core/src/services/redis/mod.rs            |   7 ++
 core/core/src/services/rocksdb/mod.rs          |   7 ++
 core/core/src/services/s3/mod.rs               |   7 ++
 core/core/src/services/seafile/mod.rs          |   7 ++
 core/core/src/services/sftp/mod.rs             |   7 ++
 core/core/src/services/sled/mod.rs             |   7 ++
 core/core/src/services/sqlite/mod.rs           |   7 ++
 core/core/src/services/surrealdb/mod.rs        |   7 ++
 core/core/src/services/swift/mod.rs            |   7 ++
 core/core/src/services/tikv/mod.rs             |   7 ++
 core/core/src/services/upyun/mod.rs            |   7 ++
 core/core/src/services/vercel_artifacts/mod.rs |   7 ++
 core/core/src/services/vercel_blob/mod.rs      |   7 ++
 core/core/src/services/webdav/mod.rs           |   7 ++
 core/core/src/services/webhdfs/mod.rs          |   7 ++
 core/core/src/services/yandex_disk/mod.rs      |   7 ++
 core/core/src/types/operator/registry.rs       | 132 +------------------------
 65 files changed, 463 insertions(+), 131 deletions(-)

diff --git a/core/Cargo.lock b/core/Cargo.lock
index 8993b5829..9c7b5927e 100644
--- a/core/Cargo.lock
+++ b/core/Cargo.lock
@@ -2223,6 +2223,22 @@ dependencies = [
  "syn 2.0.110",
 ]
 
+[[package]]
+name = "ctor"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "eb230974aaf0aca4d71665bed0aca156cf43b764fcb9583b69c6c3e686f35e72"
+dependencies = [
+ "ctor-proc-macro",
+ "dtor",
+]
+
+[[package]]
+name = "ctor-proc-macro"
+version = "0.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1"
+
 [[package]]
 name = "ctr"
 version = "0.9.2"
@@ -2607,6 +2623,21 @@ dependencies = [
  "dtoa",
 ]
 
+[[package]]
+name = "dtor"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "404d02eeb088a82cfd873006cb713fe411306c7d182c344905e101fb1167d301"
+dependencies = [
+ "dtor-proc-macro",
+]
+
+[[package]]
+name = "dtor-proc-macro"
+version = "0.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5"
+
 [[package]]
 name = "dunce"
 version = "1.0.5"
@@ -5429,6 +5460,7 @@ dependencies = [
  "compio",
  "crc32c",
  "criterion",
+ "ctor",
  "dashmap 6.1.0",
  "divan",
  "dotenvy",
diff --git a/core/core/Cargo.toml b/core/core/Cargo.toml
index 666962a1d..9210f0ce1 100644
--- a/core/core/Cargo.toml
+++ b/core/core/Cargo.toml
@@ -232,6 +232,7 @@ jiff = { version = "0.2.15", features = ["serde"] }
 log = "0.4"
 md-5 = "0.10"
 mea = { version = "0.5.1" }
+ctor = "0.6.2"
 percent-encoding = "2"
 quick-xml = { version = "0.38", features = ["serialize", "overlapped-lists"] }
 reqwest = { version = "0.12.24", features = [
diff --git a/core/core/src/docs/rfcs/6828_core.md 
b/core/core/src/docs/rfcs/6828_core.md
index 0276dd515..2ef54a627 100644
--- a/core/core/src/docs/rfcs/6828_core.md
+++ b/core/core/src/docs/rfcs/6828_core.md
@@ -50,7 +50,7 @@ opendal = { version = "0.56", features = ["service-s3", 
"layer-logging"] }
 - `opendal` facade
   - Depends on `opendal-core` (mandatory), `opendal-layer-*` and 
`opendal-service-*` as optional deps behind features.
   - Re-exports `core::{Operator, Result, ...}`, critical layers, and optional 
services/layers.
-  - On build, calls `register_builtin_services` that invokes each enabled 
service crate’s `register` function to populate `DEFAULT_OPERATOR_REGISTRY`.
+  - On build, each enabled service self-registers via a `ctor` initializer to 
populate `DEFAULT_OPERATOR_REGISTRY`.
   - Maintains feature aliases for one major version (e.g., `services-s3` -> 
`service-s3`, `layers-logging` -> `layer-logging`).
 
 ## Feature matrix
diff --git a/core/core/src/services/aliyun_drive/mod.rs 
b/core/core/src/services/aliyun_drive/mod.rs
index 7cc6a5d9b..e7c54d0a2 100644
--- a/core/core/src/services/aliyun_drive/mod.rs
+++ b/core/core/src/services/aliyun_drive/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for aliyun-drive service.
 pub const ALIYUN_DRIVE_SCHEME: &str = "aliyun-drive";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::AliyunDriveBuilder as AliyunDrive;
 pub use config::AliyunDriveConfig;
+
+#[ctor::ctor]
+fn register_aliyundrive_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<AliyunDrive>(ALIYUN_DRIVE_SCHEME);
+}
diff --git a/core/core/src/services/alluxio/mod.rs 
b/core/core/src/services/alluxio/mod.rs
index 6fa29ade2..8b420ee98 100644
--- a/core/core/src/services/alluxio/mod.rs
+++ b/core/core/src/services/alluxio/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for alluxio service.
 pub const ALLUXIO_SCHEME: &str = "alluxio";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::AlluxioBuilder as Alluxio;
 pub use config::AlluxioConfig;
+
+#[ctor::ctor]
+fn register_alluxio_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Alluxio>(ALLUXIO_SCHEME);
+}
diff --git a/core/core/src/services/azblob/mod.rs 
b/core/core/src/services/azblob/mod.rs
index d4c630c89..75a1d7211 100644
--- a/core/core/src/services/azblob/mod.rs
+++ b/core/core/src/services/azblob/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for azblob service.
 pub const AZBLOB_SCHEME: &str = "azblob";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 pub(crate) mod core;
@@ -28,3 +30,8 @@ pub(crate) mod writer;
 
 pub use backend::AzblobBuilder as Azblob;
 pub use config::AzblobConfig;
+
+#[ctor::ctor]
+fn register_azblob_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Azblob>(AZBLOB_SCHEME);
+}
diff --git a/core/core/src/services/azdls/mod.rs 
b/core/core/src/services/azdls/mod.rs
index 90dc9ab68..7a75dae09 100644
--- a/core/core/src/services/azdls/mod.rs
+++ b/core/core/src/services/azdls/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for azdls service.
 pub const AZDLS_SCHEME: &str = "azdls";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::AzdlsBuilder as Azdls;
 pub use config::AzdlsConfig;
+
+#[ctor::ctor]
+fn register_azdls_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Azdls>(AZDLS_SCHEME);
+}
diff --git a/core/core/src/services/azfile/mod.rs 
b/core/core/src/services/azfile/mod.rs
index 971b9103e..c659719f8 100644
--- a/core/core/src/services/azfile/mod.rs
+++ b/core/core/src/services/azfile/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for azfile service.
 pub const AZFILE_SCHEME: &str = "azfile";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::AzfileBuilder as Azfile;
 pub use config::AzfileConfig;
+
+#[ctor::ctor]
+fn register_azfile_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Azfile>(AZFILE_SCHEME);
+}
diff --git a/core/core/src/services/b2/mod.rs b/core/core/src/services/b2/mod.rs
index 7cd38bc92..09436541e 100644
--- a/core/core/src/services/b2/mod.rs
+++ b/core/core/src/services/b2/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for b2 service.
 pub const B2_SCHEME: &str = "b2";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::B2Builder as B2;
 pub use config::B2Config;
+
+#[ctor::ctor]
+fn register_b2_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<B2>(B2_SCHEME);
+}
diff --git a/core/core/src/services/cacache/mod.rs 
b/core/core/src/services/cacache/mod.rs
index f699c57f7..236836a2b 100644
--- a/core/core/src/services/cacache/mod.rs
+++ b/core/core/src/services/cacache/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for cacache service.
 pub const CACACHE_SCHEME: &str = "cacache";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -26,3 +28,8 @@ mod writer;
 
 pub use backend::CacacheBuilder as Cacache;
 pub use config::CacacheConfig;
+
+#[ctor::ctor]
+fn register_cacache_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Cacache>(CACACHE_SCHEME);
+}
diff --git a/core/core/src/services/cloudflare_kv/mod.rs 
b/core/core/src/services/cloudflare_kv/mod.rs
index da5ed5b25..5f5d7ae1f 100644
--- a/core/core/src/services/cloudflare_kv/mod.rs
+++ b/core/core/src/services/cloudflare_kv/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for cloudflare-kv service.
 pub const CLOUDFLARE_KV_SCHEME: &str = "cloudflare-kv";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -29,3 +31,8 @@ mod writer;
 
 pub use backend::CloudflareKvBuilder as CloudflareKv;
 pub use config::CloudflareKvConfig;
+
+#[ctor::ctor]
+fn register_cloudflarekv_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<CloudflareKv>(CLOUDFLARE_KV_SCHEME);
+}
diff --git a/core/core/src/services/compfs/mod.rs 
b/core/core/src/services/compfs/mod.rs
index 00c909c78..5f51aa2ed 100644
--- a/core/core/src/services/compfs/mod.rs
+++ b/core/core/src/services/compfs/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for compfs service.
 pub const COMPFS_SCHEME: &str = "compfs";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::CompfsBuilder as Compfs;
 pub use config::CompfsConfig;
+
+#[ctor::ctor]
+fn register_compfs_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Compfs>(COMPFS_SCHEME);
+}
diff --git a/core/core/src/services/cos/mod.rs 
b/core/core/src/services/cos/mod.rs
index d4c22e003..f2d4ca515 100644
--- a/core/core/src/services/cos/mod.rs
+++ b/core/core/src/services/cos/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for cos service.
 pub const COS_SCHEME: &str = "cos";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::CosBuilder as Cos;
 pub use config::CosConfig;
+
+#[ctor::ctor]
+fn register_cos_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Cos>(COS_SCHEME);
+}
diff --git a/core/core/src/services/d1/mod.rs b/core/core/src/services/d1/mod.rs
index 6d275db5b..d773e8f86 100644
--- a/core/core/src/services/d1/mod.rs
+++ b/core/core/src/services/d1/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for d1 service.
 pub const D1_SCHEME: &str = "d1";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::D1Builder as D1;
 pub use config::D1Config;
+
+#[ctor::ctor]
+fn register_d1_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<D1>(D1_SCHEME);
+}
diff --git a/core/core/src/services/dashmap/mod.rs 
b/core/core/src/services/dashmap/mod.rs
index 1357e67ff..eff210847 100644
--- a/core/core/src/services/dashmap/mod.rs
+++ b/core/core/src/services/dashmap/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for dashmap service.
 pub const DASHMAP_SCHEME: &str = "dashmap";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -27,3 +29,8 @@ mod writer;
 
 pub use backend::DashmapBuilder as Dashmap;
 pub use config::DashmapConfig;
+
+#[ctor::ctor]
+fn register_dashmap_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Dashmap>(DASHMAP_SCHEME);
+}
diff --git a/core/core/src/services/dbfs/mod.rs 
b/core/core/src/services/dbfs/mod.rs
index c09175cb2..0b7c23d77 100644
--- a/core/core/src/services/dbfs/mod.rs
+++ b/core/core/src/services/dbfs/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for dbfs service.
 pub const DBFS_SCHEME: &str = "dbfs";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::DbfsBuilder as Dbfs;
 pub use config::DbfsConfig;
+
+#[ctor::ctor]
+fn register_dbfs_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Dbfs>(DBFS_SCHEME);
+}
diff --git a/core/core/src/services/dropbox/mod.rs 
b/core/core/src/services/dropbox/mod.rs
index 7efc88d97..3195bf5e5 100644
--- a/core/core/src/services/dropbox/mod.rs
+++ b/core/core/src/services/dropbox/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for dropbox service.
 pub const DROPBOX_SCHEME: &str = "dropbox";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod builder;
 mod config;
@@ -29,3 +31,8 @@ mod writer;
 
 pub use builder::DropboxBuilder as Dropbox;
 pub use config::DropboxConfig;
+
+#[ctor::ctor]
+fn register_dropbox_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Dropbox>(DROPBOX_SCHEME);
+}
diff --git a/core/core/src/services/etcd/mod.rs 
b/core/core/src/services/etcd/mod.rs
index cb0837db6..a28e5fdca 100644
--- a/core/core/src/services/etcd/mod.rs
+++ b/core/core/src/services/etcd/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for etcd service.
 pub const ETCD_SCHEME: &str = "etcd";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::EtcdBuilder as Etcd;
 pub use config::EtcdConfig;
+
+#[ctor::ctor]
+fn register_etcd_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Etcd>(ETCD_SCHEME);
+}
diff --git a/core/core/src/services/foundationdb/mod.rs 
b/core/core/src/services/foundationdb/mod.rs
index 7d29dd776..cf67f3f0b 100644
--- a/core/core/src/services/foundationdb/mod.rs
+++ b/core/core/src/services/foundationdb/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for foundationdb service.
 pub const FOUNDATIONDB_SCHEME: &str = "foundationdb";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -26,3 +28,8 @@ mod writer;
 
 pub use backend::FoundationdbBuilder as Foundationdb;
 pub use config::FoundationdbConfig;
+
+#[ctor::ctor]
+fn register_foundationdb_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Foundationdb>(FOUNDATIONDB_SCHEME);
+}
diff --git a/core/core/src/services/fs/mod.rs b/core/core/src/services/fs/mod.rs
index b463d11df..96b064718 100644
--- a/core/core/src/services/fs/mod.rs
+++ b/core/core/src/services/fs/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for fs service.
 pub const FS_SCHEME: &str = "fs";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -29,3 +31,8 @@ mod writer;
 
 pub use backend::FsBuilder as Fs;
 pub use config::FsConfig;
+
+#[ctor::ctor]
+fn register_fs_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Fs>(FS_SCHEME);
+}
diff --git a/core/core/src/services/ftp/mod.rs 
b/core/core/src/services/ftp/mod.rs
index 9d8047b0c..cead8f392 100644
--- a/core/core/src/services/ftp/mod.rs
+++ b/core/core/src/services/ftp/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for ftp service.
 pub const FTP_SCHEME: &str = "ftp";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -29,3 +31,8 @@ mod writer;
 
 pub use backend::FtpBuilder as Ftp;
 pub use config::FtpConfig;
+
+#[ctor::ctor]
+fn register_ftp_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Ftp>(FTP_SCHEME);
+}
diff --git a/core/core/src/services/gcs/mod.rs 
b/core/core/src/services/gcs/mod.rs
index ccdf38253..437e9aa14 100644
--- a/core/core/src/services/gcs/mod.rs
+++ b/core/core/src/services/gcs/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for gcs service.
 pub const GCS_SCHEME: &str = "gcs";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -29,3 +31,8 @@ mod writer;
 
 pub use backend::GcsBuilder as Gcs;
 pub use config::GcsConfig;
+
+#[ctor::ctor]
+fn register_gcs_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Gcs>(GCS_SCHEME);
+}
diff --git a/core/core/src/services/gdrive/mod.rs 
b/core/core/src/services/gdrive/mod.rs
index 11d4cb609..25d6f1aed 100644
--- a/core/core/src/services/gdrive/mod.rs
+++ b/core/core/src/services/gdrive/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for gdrive service.
 pub const GDRIVE_SCHEME: &str = "gdrive";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod builder;
 mod config;
@@ -29,3 +31,8 @@ mod writer;
 
 pub use builder::GdriveBuilder as Gdrive;
 pub use config::GdriveConfig;
+
+#[ctor::ctor]
+fn register_gdrive_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Gdrive>(GDRIVE_SCHEME);
+}
diff --git a/core/core/src/services/ghac/mod.rs 
b/core/core/src/services/ghac/mod.rs
index f7e65f313..c35782850 100644
--- a/core/core/src/services/ghac/mod.rs
+++ b/core/core/src/services/ghac/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for ghac service.
 pub const GHAC_SCHEME: &str = "ghac";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -26,3 +28,8 @@ mod writer;
 
 pub use backend::GhacBuilder as Ghac;
 pub use config::GhacConfig;
+
+#[ctor::ctor]
+fn register_ghac_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Ghac>(GHAC_SCHEME);
+}
diff --git a/core/core/src/services/github/mod.rs 
b/core/core/src/services/github/mod.rs
index 4852744f0..9cb8c0abd 100644
--- a/core/core/src/services/github/mod.rs
+++ b/core/core/src/services/github/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for github service.
 pub const GITHUB_SCHEME: &str = "github";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::GithubBuilder as Github;
 pub use config::GithubConfig;
+
+#[ctor::ctor]
+fn register_github_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Github>(GITHUB_SCHEME);
+}
diff --git a/core/core/src/services/gridfs/mod.rs 
b/core/core/src/services/gridfs/mod.rs
index e969369ae..93d4fe611 100644
--- a/core/core/src/services/gridfs/mod.rs
+++ b/core/core/src/services/gridfs/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for gridfs service.
 pub const GRIDFS_SCHEME: &str = "gridfs";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -26,3 +28,8 @@ mod writer;
 
 pub use backend::GridfsBuilder as Gridfs;
 pub use config::GridfsConfig;
+
+#[ctor::ctor]
+fn register_gridfs_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Gridfs>(GRIDFS_SCHEME);
+}
diff --git a/core/core/src/services/hdfs/mod.rs 
b/core/core/src/services/hdfs/mod.rs
index 7b0f5fd85..de2c0e349 100644
--- a/core/core/src/services/hdfs/mod.rs
+++ b/core/core/src/services/hdfs/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for hdfs service.
 pub const HDFS_SCHEME: &str = "hdfs";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::HdfsBuilder as Hdfs;
 pub use config::HdfsConfig;
+
+#[ctor::ctor]
+fn register_hdfs_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Hdfs>(HDFS_SCHEME);
+}
diff --git a/core/core/src/services/hdfs_native/mod.rs 
b/core/core/src/services/hdfs_native/mod.rs
index 81f33cda7..6ff307f5a 100644
--- a/core/core/src/services/hdfs_native/mod.rs
+++ b/core/core/src/services/hdfs_native/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for hdfs-native service.
 pub const HDFS_NATIVE_SCHEME: &str = "hdfs-native";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -29,3 +31,8 @@ mod writer;
 
 pub use backend::HdfsNativeBuilder as HdfsNative;
 pub use config::HdfsNativeConfig;
+
+#[ctor::ctor]
+fn register_hdfsnative_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<HdfsNative>(HDFS_NATIVE_SCHEME);
+}
diff --git a/core/core/src/services/http/mod.rs 
b/core/core/src/services/http/mod.rs
index af2440287..5b3975d7b 100644
--- a/core/core/src/services/http/mod.rs
+++ b/core/core/src/services/http/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for http service.
 pub const HTTP_SCHEME: &str = "http";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -25,3 +27,8 @@ mod error;
 
 pub use backend::HttpBuilder as Http;
 pub use config::HttpConfig;
+
+#[ctor::ctor]
+fn register_http_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Http>(HTTP_SCHEME);
+}
diff --git a/core/core/src/services/huggingface/mod.rs 
b/core/core/src/services/huggingface/mod.rs
index 68b9d09a3..3576c2216 100644
--- a/core/core/src/services/huggingface/mod.rs
+++ b/core/core/src/services/huggingface/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for huggingface service.
 pub const HUGGINGFACE_SCHEME: &str = "huggingface";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -26,3 +28,8 @@ mod lister;
 
 pub use backend::HuggingfaceBuilder as Huggingface;
 pub use config::HuggingfaceConfig;
+
+#[ctor::ctor]
+fn register_huggingface_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Huggingface>(HUGGINGFACE_SCHEME);
+}
diff --git a/core/core/src/services/ipfs/mod.rs 
b/core/core/src/services/ipfs/mod.rs
index 71c48b8bd..59e68e5f9 100644
--- a/core/core/src/services/ipfs/mod.rs
+++ b/core/core/src/services/ipfs/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for ipfs service.
 pub const IPFS_SCHEME: &str = "ipfs";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -26,3 +28,8 @@ mod ipld;
 
 pub use backend::IpfsBuilder as Ipfs;
 pub use config::IpfsConfig;
+
+#[ctor::ctor]
+fn register_ipfs_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Ipfs>(IPFS_SCHEME);
+}
diff --git a/core/core/src/services/ipmfs/mod.rs 
b/core/core/src/services/ipmfs/mod.rs
index b1ae29161..58f92b507 100644
--- a/core/core/src/services/ipmfs/mod.rs
+++ b/core/core/src/services/ipmfs/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for ipmfs service.
 pub const IPMFS_SCHEME: &str = "ipmfs";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod builder;
 mod config;
@@ -29,3 +31,8 @@ mod writer;
 
 pub use builder::IpmfsBuilder as Ipmfs;
 pub use config::IpmfsConfig;
+
+#[ctor::ctor]
+fn register_ipmfs_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Ipmfs>(IPMFS_SCHEME);
+}
diff --git a/core/core/src/services/koofr/mod.rs 
b/core/core/src/services/koofr/mod.rs
index eabacd782..fe86028e4 100644
--- a/core/core/src/services/koofr/mod.rs
+++ b/core/core/src/services/koofr/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for koofr service.
 pub const KOOFR_SCHEME: &str = "koofr";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::KoofrBuilder as Koofr;
 pub use config::KoofrConfig;
+
+#[ctor::ctor]
+fn register_koofr_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Koofr>(KOOFR_SCHEME);
+}
diff --git a/core/core/src/services/lakefs/mod.rs 
b/core/core/src/services/lakefs/mod.rs
index e4cef817c..cc55ed939 100644
--- a/core/core/src/services/lakefs/mod.rs
+++ b/core/core/src/services/lakefs/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for lakefs service.
 pub const LAKEFS_SCHEME: &str = "lakefs";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::LakefsBuilder as Lakefs;
 pub use config::LakefsConfig;
+
+#[ctor::ctor]
+fn register_lakefs_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Lakefs>(LAKEFS_SCHEME);
+}
diff --git a/core/core/src/services/memcached/mod.rs 
b/core/core/src/services/memcached/mod.rs
index 7bd879b7f..c10fef6a0 100644
--- a/core/core/src/services/memcached/mod.rs
+++ b/core/core/src/services/memcached/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for memcached service.
 pub const MEMCACHED_SCHEME: &str = "memcached";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod binary;
 mod config;
@@ -27,3 +29,8 @@ mod writer;
 
 pub use backend::MemcachedBuilder as Memcached;
 pub use config::MemcachedConfig;
+
+#[ctor::ctor]
+fn register_memcached_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Memcached>(MEMCACHED_SCHEME);
+}
diff --git a/core/core/src/services/memory/mod.rs 
b/core/core/src/services/memory/mod.rs
index 71af2d39d..80a0bf3da 100644
--- a/core/core/src/services/memory/mod.rs
+++ b/core/core/src/services/memory/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for memory service.
 pub const MEMORY_SCHEME: &str = "memory";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -27,3 +29,8 @@ mod writer;
 
 pub use backend::MemoryBuilder as Memory;
 pub use config::MemoryConfig;
+
+#[ctor::ctor]
+fn register_memory_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Memory>(MEMORY_SCHEME);
+}
diff --git a/core/core/src/services/mini_moka/mod.rs 
b/core/core/src/services/mini_moka/mod.rs
index 216248185..1df625522 100644
--- a/core/core/src/services/mini_moka/mod.rs
+++ b/core/core/src/services/mini_moka/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for mini-moka service.
 pub const MINI_MOKA_SCHEME: &str = "mini-moka";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -27,3 +29,8 @@ mod writer;
 
 pub use backend::MiniMokaBuilder as MiniMoka;
 pub use config::MiniMokaConfig;
+
+#[ctor::ctor]
+fn register_minimoka_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<MiniMoka>(MINI_MOKA_SCHEME);
+}
diff --git a/core/core/src/services/moka/mod.rs 
b/core/core/src/services/moka/mod.rs
index ea5bfc216..6d5ca4b64 100644
--- a/core/core/src/services/moka/mod.rs
+++ b/core/core/src/services/moka/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for moka service.
 pub const MOKA_SCHEME: &str = "moka";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -29,3 +31,8 @@ pub use backend::MokaBuilder as Moka;
 pub use backend::MokaCacheBuilder;
 pub use config::MokaConfig;
 pub use core::MokaValue;
+
+#[ctor::ctor]
+fn register_moka_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Moka>(MOKA_SCHEME);
+}
diff --git a/core/core/src/services/mongodb/mod.rs 
b/core/core/src/services/mongodb/mod.rs
index a2a6b7e7e..e2fc75c48 100644
--- a/core/core/src/services/mongodb/mod.rs
+++ b/core/core/src/services/mongodb/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for mongodb service.
 pub const MONGODB_SCHEME: &str = "mongodb";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -26,3 +28,8 @@ mod writer;
 
 pub use backend::MongodbBuilder as Mongodb;
 pub use config::MongodbConfig;
+
+#[ctor::ctor]
+fn register_mongodb_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Mongodb>(MONGODB_SCHEME);
+}
diff --git a/core/core/src/services/monoiofs/mod.rs 
b/core/core/src/services/monoiofs/mod.rs
index 2beaae63d..1915761d2 100644
--- a/core/core/src/services/monoiofs/mod.rs
+++ b/core/core/src/services/monoiofs/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for monoiofs service.
 pub const MONOIOFS_SCHEME: &str = "monoiofs";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -27,3 +29,8 @@ mod writer;
 
 pub use backend::MonoiofsBuilder as Monoiofs;
 pub use config::MonoiofsConfig;
+
+#[ctor::ctor]
+fn register_monoiofs_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Monoiofs>(MONOIOFS_SCHEME);
+}
diff --git a/core/core/src/services/mysql/mod.rs 
b/core/core/src/services/mysql/mod.rs
index 5ccf41199..3bd42214e 100644
--- a/core/core/src/services/mysql/mod.rs
+++ b/core/core/src/services/mysql/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for mysql service.
 pub const MYSQL_SCHEME: &str = "mysql";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -26,3 +28,8 @@ mod writer;
 
 pub use backend::MysqlBuilder as Mysql;
 pub use config::MysqlConfig;
+
+#[ctor::ctor]
+fn register_mysql_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Mysql>(MYSQL_SCHEME);
+}
diff --git a/core/core/src/services/obs/mod.rs 
b/core/core/src/services/obs/mod.rs
index 417ef04ae..b9be65574 100644
--- a/core/core/src/services/obs/mod.rs
+++ b/core/core/src/services/obs/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for obs service.
 pub const OBS_SCHEME: &str = "obs";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::ObsBuilder as Obs;
 pub use config::ObsConfig;
+
+#[ctor::ctor]
+fn register_obs_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Obs>(OBS_SCHEME);
+}
diff --git a/core/core/src/services/onedrive/mod.rs 
b/core/core/src/services/onedrive/mod.rs
index 5f78a0d78..ebf9f189e 100644
--- a/core/core/src/services/onedrive/mod.rs
+++ b/core/core/src/services/onedrive/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for onedrive service.
 pub const ONEDRIVE_SCHEME: &str = "onedrive";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod builder;
 mod config;
@@ -30,3 +32,8 @@ mod writer;
 
 pub use builder::OnedriveBuilder as Onedrive;
 pub use config::OnedriveConfig;
+
+#[ctor::ctor]
+fn register_onedrive_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Onedrive>(ONEDRIVE_SCHEME);
+}
diff --git a/core/core/src/services/oss/mod.rs 
b/core/core/src/services/oss/mod.rs
index 62d233c1e..cf7055624 100644
--- a/core/core/src/services/oss/mod.rs
+++ b/core/core/src/services/oss/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for oss service.
 pub const OSS_SCHEME: &str = "oss";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::OssBuilder as Oss;
 pub use config::OssConfig;
+
+#[ctor::ctor]
+fn register_oss_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Oss>(OSS_SCHEME);
+}
diff --git a/core/core/src/services/pcloud/mod.rs 
b/core/core/src/services/pcloud/mod.rs
index e01002900..3295b09ba 100644
--- a/core/core/src/services/pcloud/mod.rs
+++ b/core/core/src/services/pcloud/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for pcloud service.
 pub const PCLOUD_SCHEME: &str = "pcloud";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::PcloudBuilder as Pcloud;
 pub use config::PcloudConfig;
+
+#[ctor::ctor]
+fn register_pcloud_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Pcloud>(PCLOUD_SCHEME);
+}
diff --git a/core/core/src/services/persy/mod.rs 
b/core/core/src/services/persy/mod.rs
index 9ebbf8dfd..1dd724b05 100644
--- a/core/core/src/services/persy/mod.rs
+++ b/core/core/src/services/persy/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for persy service.
 pub const PERSY_SCHEME: &str = "persy";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -26,3 +28,8 @@ mod writer;
 
 pub use backend::PersyBuilder as Persy;
 pub use config::PersyConfig;
+
+#[ctor::ctor]
+fn register_persy_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Persy>(PERSY_SCHEME);
+}
diff --git a/core/core/src/services/postgresql/mod.rs 
b/core/core/src/services/postgresql/mod.rs
index ca2fdc086..25863aee0 100644
--- a/core/core/src/services/postgresql/mod.rs
+++ b/core/core/src/services/postgresql/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for postgresql service.
 pub const POSTGRESQL_SCHEME: &str = "postgresql";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -26,3 +28,8 @@ mod writer;
 
 pub use backend::PostgresqlBuilder as Postgresql;
 pub use config::PostgresqlConfig;
+
+#[ctor::ctor]
+fn register_postgresql_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Postgresql>(POSTGRESQL_SCHEME);
+}
diff --git a/core/core/src/services/redb/mod.rs 
b/core/core/src/services/redb/mod.rs
index 05b421448..3d653a1e6 100644
--- a/core/core/src/services/redb/mod.rs
+++ b/core/core/src/services/redb/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for redb service.
 pub const REDB_SCHEME: &str = "redb";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -26,3 +28,8 @@ mod writer;
 
 pub use backend::RedbBuilder as Redb;
 pub use config::RedbConfig;
+
+#[ctor::ctor]
+fn register_redb_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Redb>(REDB_SCHEME);
+}
diff --git a/core/core/src/services/redis/mod.rs 
b/core/core/src/services/redis/mod.rs
index d0610f508..6d0563bcc 100644
--- a/core/core/src/services/redis/mod.rs
+++ b/core/core/src/services/redis/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for redis service.
 pub const REDIS_SCHEME: &str = "redis";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -26,3 +28,8 @@ mod writer;
 
 pub use backend::RedisBuilder as Redis;
 pub use config::RedisConfig;
+
+#[ctor::ctor]
+fn register_redis_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Redis>(REDIS_SCHEME);
+}
diff --git a/core/core/src/services/rocksdb/mod.rs 
b/core/core/src/services/rocksdb/mod.rs
index a4788f093..4447dc778 100644
--- a/core/core/src/services/rocksdb/mod.rs
+++ b/core/core/src/services/rocksdb/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for rocksdb service.
 pub const ROCKSDB_SCHEME: &str = "rocksdb";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -27,3 +29,8 @@ mod writer;
 
 pub use backend::RocksdbBuilder as Rocksdb;
 pub use config::RocksdbConfig;
+
+#[ctor::ctor]
+fn register_rocksdb_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Rocksdb>(ROCKSDB_SCHEME);
+}
diff --git a/core/core/src/services/s3/mod.rs b/core/core/src/services/s3/mod.rs
index 5c8bb617b..432f8f45e 100644
--- a/core/core/src/services/s3/mod.rs
+++ b/core/core/src/services/s3/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for s3 service.
 pub const S3_SCHEME: &str = "s3";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::S3Builder as S3;
 pub use config::S3Config;
+
+#[ctor::ctor]
+fn register_s3_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<S3>(S3_SCHEME);
+}
diff --git a/core/core/src/services/seafile/mod.rs 
b/core/core/src/services/seafile/mod.rs
index d658fff41..94abafc0b 100644
--- a/core/core/src/services/seafile/mod.rs
+++ b/core/core/src/services/seafile/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for seafile service.
 pub const SEAFILE_SCHEME: &str = "seafile";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::SeafileBuilder as Seafile;
 pub use config::SeafileConfig;
+
+#[ctor::ctor]
+fn register_seafile_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Seafile>(SEAFILE_SCHEME);
+}
diff --git a/core/core/src/services/sftp/mod.rs 
b/core/core/src/services/sftp/mod.rs
index cb608983d..5712c4bdc 100644
--- a/core/core/src/services/sftp/mod.rs
+++ b/core/core/src/services/sftp/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for sftp service.
 pub const SFTP_SCHEME: &str = "sftp";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -30,3 +32,8 @@ mod writer;
 
 pub use backend::SftpBuilder as Sftp;
 pub use config::SftpConfig;
+
+#[ctor::ctor]
+fn register_sftp_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Sftp>(SFTP_SCHEME);
+}
diff --git a/core/core/src/services/sled/mod.rs 
b/core/core/src/services/sled/mod.rs
index 70f043b0e..915fa9de3 100644
--- a/core/core/src/services/sled/mod.rs
+++ b/core/core/src/services/sled/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for sled service.
 pub const SLED_SCHEME: &str = "sled";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -27,3 +29,8 @@ mod writer;
 
 pub use backend::SledBuilder as Sled;
 pub use config::SledConfig;
+
+#[ctor::ctor]
+fn register_sled_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Sled>(SLED_SCHEME);
+}
diff --git a/core/core/src/services/sqlite/mod.rs 
b/core/core/src/services/sqlite/mod.rs
index c498866e4..c6783d57f 100644
--- a/core/core/src/services/sqlite/mod.rs
+++ b/core/core/src/services/sqlite/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for sqlite service.
 pub const SQLITE_SCHEME: &str = "sqlite";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -26,3 +28,8 @@ mod writer;
 
 pub use backend::SqliteBuilder as Sqlite;
 pub use config::SqliteConfig;
+
+#[ctor::ctor]
+fn register_sqlite_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Sqlite>(SQLITE_SCHEME);
+}
diff --git a/core/core/src/services/surrealdb/mod.rs 
b/core/core/src/services/surrealdb/mod.rs
index 94437dda4..722ace1e5 100644
--- a/core/core/src/services/surrealdb/mod.rs
+++ b/core/core/src/services/surrealdb/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for surrealdb service.
 pub const SURREALDB_SCHEME: &str = "surrealdb";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -26,3 +28,8 @@ mod writer;
 
 pub use backend::SurrealdbBuilder as Surrealdb;
 pub use config::SurrealdbConfig;
+
+#[ctor::ctor]
+fn register_surrealdb_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Surrealdb>(SURREALDB_SCHEME);
+}
diff --git a/core/core/src/services/swift/mod.rs 
b/core/core/src/services/swift/mod.rs
index 4eff77934..506de54d5 100644
--- a/core/core/src/services/swift/mod.rs
+++ b/core/core/src/services/swift/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for swift service.
 pub const SWIFT_SCHEME: &str = "swift";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::SwiftBuilder as Swift;
 pub use config::SwiftConfig;
+
+#[ctor::ctor]
+fn register_swift_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Swift>(SWIFT_SCHEME);
+}
diff --git a/core/core/src/services/tikv/mod.rs 
b/core/core/src/services/tikv/mod.rs
index 639edf7bd..6bd30e843 100644
--- a/core/core/src/services/tikv/mod.rs
+++ b/core/core/src/services/tikv/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for tikv service.
 pub const TIKV_SCHEME: &str = "tikv";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -26,3 +28,8 @@ mod writer;
 
 pub use backend::TikvBuilder as Tikv;
 pub use config::TikvConfig;
+
+#[ctor::ctor]
+fn register_tikv_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Tikv>(TIKV_SCHEME);
+}
diff --git a/core/core/src/services/upyun/mod.rs 
b/core/core/src/services/upyun/mod.rs
index 9f65e9405..960f2d241 100644
--- a/core/core/src/services/upyun/mod.rs
+++ b/core/core/src/services/upyun/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for upyun service.
 pub const UPYUN_SCHEME: &str = "upyun";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::UpyunBuilder as Upyun;
 pub use config::UpyunConfig;
+
+#[ctor::ctor]
+fn register_upyun_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Upyun>(UPYUN_SCHEME);
+}
diff --git a/core/core/src/services/vercel_artifacts/mod.rs 
b/core/core/src/services/vercel_artifacts/mod.rs
index c160d557e..fe3ae58fc 100644
--- a/core/core/src/services/vercel_artifacts/mod.rs
+++ b/core/core/src/services/vercel_artifacts/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for vercel-artifacts service.
 pub const VERCEL_ARTIFACTS_SCHEME: &str = "vercel-artifacts";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod builder;
 mod config;
@@ -27,3 +29,8 @@ mod writer;
 
 pub use builder::VercelArtifactsBuilder as VercelArtifacts;
 pub use config::VercelArtifactsConfig;
+
+#[ctor::ctor]
+fn register_vercelartifacts_service() {
+    
DEFAULT_OPERATOR_REGISTRY.register::<VercelArtifacts>(VERCEL_ARTIFACTS_SCHEME);
+}
diff --git a/core/core/src/services/vercel_blob/mod.rs 
b/core/core/src/services/vercel_blob/mod.rs
index f989d5bf0..684eab202 100644
--- a/core/core/src/services/vercel_blob/mod.rs
+++ b/core/core/src/services/vercel_blob/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for vercel-blob service.
 pub const VERCEL_BLOB_SCHEME: &str = "vercel-blob";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::VercelBlobBuilder as VercelBlob;
 pub use config::VercelBlobConfig;
+
+#[ctor::ctor]
+fn register_vercelblob_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<VercelBlob>(VERCEL_BLOB_SCHEME);
+}
diff --git a/core/core/src/services/webdav/mod.rs 
b/core/core/src/services/webdav/mod.rs
index 7e46b570c..1fd1f194e 100644
--- a/core/core/src/services/webdav/mod.rs
+++ b/core/core/src/services/webdav/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for webdav service.
 pub const WEBDAV_SCHEME: &str = "webdav";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::WebdavBuilder as Webdav;
 pub use config::WebdavConfig;
+
+#[ctor::ctor]
+fn register_webdav_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Webdav>(WEBDAV_SCHEME);
+}
diff --git a/core/core/src/services/webhdfs/mod.rs 
b/core/core/src/services/webhdfs/mod.rs
index 7e9c47125..7dd99edc8 100644
--- a/core/core/src/services/webhdfs/mod.rs
+++ b/core/core/src/services/webhdfs/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for webhdfs service.
 pub const WEBHDFS_SCHEME: &str = "webhdfs";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -29,3 +31,8 @@ mod writer;
 
 pub use backend::WebhdfsBuilder as Webhdfs;
 pub use config::WebhdfsConfig;
+
+#[ctor::ctor]
+fn register_webhdfs_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<Webhdfs>(WEBHDFS_SCHEME);
+}
diff --git a/core/core/src/services/yandex_disk/mod.rs 
b/core/core/src/services/yandex_disk/mod.rs
index 3c2224bdd..271d2da6d 100644
--- a/core/core/src/services/yandex_disk/mod.rs
+++ b/core/core/src/services/yandex_disk/mod.rs
@@ -18,6 +18,8 @@
 /// Default scheme for yandex-disk service.
 pub const YANDEX_DISK_SCHEME: &str = "yandex-disk";
 
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
 mod backend;
 mod config;
 mod core;
@@ -28,3 +30,8 @@ mod writer;
 
 pub use backend::YandexDiskBuilder as YandexDisk;
 pub use config::YandexDiskConfig;
+
+#[ctor::ctor]
+fn register_yandexdisk_service() {
+    DEFAULT_OPERATOR_REGISTRY.register::<YandexDisk>(YANDEX_DISK_SCHEME);
+}
diff --git a/core/core/src/types/operator/registry.rs 
b/core/core/src/types/operator/registry.rs
index d4dcf0f2a..8afeee43f 100644
--- a/core/core/src/types/operator/registry.rs
+++ b/core/core/src/types/operator/registry.rs
@@ -26,11 +26,8 @@ use crate::{Error, ErrorKind, Operator, Result};
 pub type OperatorFactory = fn(&OperatorUri) -> Result<Operator>;
 
 /// Default registry initialized with builtin services.
-pub static DEFAULT_OPERATOR_REGISTRY: LazyLock<OperatorRegistry> = 
LazyLock::new(|| {
-    let registry = OperatorRegistry::new();
-    register_builtin_services(&registry);
-    registry
-});
+pub static DEFAULT_OPERATOR_REGISTRY: LazyLock<OperatorRegistry> =
+    LazyLock::new(OperatorRegistry::new);
 
 /// Global registry that maps schemes to [`OperatorFactory`] functions.
 #[derive(Debug, Default)]
@@ -76,131 +73,6 @@ impl OperatorRegistry {
     }
 }
 
-fn register_builtin_services(registry: &OperatorRegistry) {
-    #[cfg(feature = "services-aliyun-drive")]
-    
registry.register::<crate::services::AliyunDrive>(crate::services::ALIYUN_DRIVE_SCHEME);
-    #[cfg(feature = "services-alluxio")]
-    
registry.register::<crate::services::Alluxio>(crate::services::ALLUXIO_SCHEME);
-    #[cfg(feature = "services-azblob")]
-    
registry.register::<crate::services::Azblob>(crate::services::AZBLOB_SCHEME);
-    #[cfg(feature = "services-azdls")]
-    registry.register::<crate::services::Azdls>(crate::services::AZDLS_SCHEME);
-    #[cfg(feature = "services-azfile")]
-    
registry.register::<crate::services::Azfile>(crate::services::AZFILE_SCHEME);
-    #[cfg(feature = "services-b2")]
-    registry.register::<crate::services::B2>(crate::services::B2_SCHEME);
-    #[cfg(feature = "services-cacache")]
-    
registry.register::<crate::services::Cacache>(crate::services::CACACHE_SCHEME);
-    #[cfg(feature = "services-cloudflare-kv")]
-    
registry.register::<crate::services::CloudflareKv>(crate::services::CLOUDFLARE_KV_SCHEME);
-    #[cfg(feature = "services-compfs")]
-    
registry.register::<crate::services::Compfs>(crate::services::COMPFS_SCHEME);
-    #[cfg(feature = "services-cos")]
-    registry.register::<crate::services::Cos>(crate::services::COS_SCHEME);
-    #[cfg(feature = "services-d1")]
-    registry.register::<crate::services::D1>(crate::services::D1_SCHEME);
-    #[cfg(feature = "services-dashmap")]
-    
registry.register::<crate::services::Dashmap>(crate::services::DASHMAP_SCHEME);
-    #[cfg(feature = "services-dbfs")]
-    registry.register::<crate::services::Dbfs>(crate::services::DBFS_SCHEME);
-    #[cfg(feature = "services-dropbox")]
-    
registry.register::<crate::services::Dropbox>(crate::services::DROPBOX_SCHEME);
-    #[cfg(feature = "services-etcd")]
-    registry.register::<crate::services::Etcd>(crate::services::ETCD_SCHEME);
-    #[cfg(feature = "services-foundationdb")]
-    
registry.register::<crate::services::Foundationdb>(crate::services::FOUNDATIONDB_SCHEME);
-    #[cfg(feature = "services-fs")]
-    registry.register::<crate::services::Fs>(crate::services::FS_SCHEME);
-    #[cfg(feature = "services-ftp")]
-    registry.register::<crate::services::Ftp>(crate::services::FTP_SCHEME);
-    #[cfg(feature = "services-gcs")]
-    registry.register::<crate::services::Gcs>(crate::services::GCS_SCHEME);
-    #[cfg(feature = "services-gdrive")]
-    
registry.register::<crate::services::Gdrive>(crate::services::GDRIVE_SCHEME);
-    #[cfg(feature = "services-ghac")]
-    registry.register::<crate::services::Ghac>(crate::services::GHAC_SCHEME);
-    #[cfg(feature = "services-github")]
-    
registry.register::<crate::services::Github>(crate::services::GITHUB_SCHEME);
-    #[cfg(feature = "services-gridfs")]
-    
registry.register::<crate::services::Gridfs>(crate::services::GRIDFS_SCHEME);
-    #[cfg(feature = "services-hdfs")]
-    registry.register::<crate::services::Hdfs>(crate::services::HDFS_SCHEME);
-    #[cfg(feature = "services-hdfs-native")]
-    
registry.register::<crate::services::HdfsNative>(crate::services::HDFS_NATIVE_SCHEME);
-    #[cfg(feature = "services-http")]
-    registry.register::<crate::services::Http>(crate::services::HTTP_SCHEME);
-    #[cfg(feature = "services-huggingface")]
-    
registry.register::<crate::services::Huggingface>(crate::services::HUGGINGFACE_SCHEME);
-    #[cfg(feature = "services-ipfs")]
-    registry.register::<crate::services::Ipfs>(crate::services::IPFS_SCHEME);
-    #[cfg(feature = "services-ipmfs")]
-    registry.register::<crate::services::Ipmfs>(crate::services::IPMFS_SCHEME);
-    #[cfg(feature = "services-koofr")]
-    registry.register::<crate::services::Koofr>(crate::services::KOOFR_SCHEME);
-    #[cfg(feature = "services-lakefs")]
-    
registry.register::<crate::services::Lakefs>(crate::services::LAKEFS_SCHEME);
-    #[cfg(feature = "services-memcached")]
-    
registry.register::<crate::services::Memcached>(crate::services::MEMCACHED_SCHEME);
-    #[cfg(feature = "services-memory")]
-    
registry.register::<crate::services::Memory>(crate::services::MEMORY_SCHEME);
-    #[cfg(feature = "services-mini-moka")]
-    
registry.register::<crate::services::MiniMoka>(crate::services::MINI_MOKA_SCHEME);
-    #[cfg(feature = "services-moka")]
-    registry.register::<crate::services::Moka>(crate::services::MOKA_SCHEME);
-    #[cfg(feature = "services-mongodb")]
-    
registry.register::<crate::services::Mongodb>(crate::services::MONGODB_SCHEME);
-    #[cfg(feature = "services-monoiofs")]
-    
registry.register::<crate::services::Monoiofs>(crate::services::MONOIOFS_SCHEME);
-    #[cfg(feature = "services-mysql")]
-    registry.register::<crate::services::Mysql>(crate::services::MYSQL_SCHEME);
-    #[cfg(feature = "services-obs")]
-    registry.register::<crate::services::Obs>(crate::services::OBS_SCHEME);
-    #[cfg(feature = "services-onedrive")]
-    
registry.register::<crate::services::Onedrive>(crate::services::ONEDRIVE_SCHEME);
-    #[cfg(feature = "services-oss")]
-    registry.register::<crate::services::Oss>(crate::services::OSS_SCHEME);
-    #[cfg(feature = "services-pcloud")]
-    
registry.register::<crate::services::Pcloud>(crate::services::PCLOUD_SCHEME);
-    #[cfg(feature = "services-persy")]
-    registry.register::<crate::services::Persy>(crate::services::PERSY_SCHEME);
-    #[cfg(feature = "services-postgresql")]
-    
registry.register::<crate::services::Postgresql>(crate::services::POSTGRESQL_SCHEME);
-    #[cfg(feature = "services-redb")]
-    registry.register::<crate::services::Redb>(crate::services::REDB_SCHEME);
-    #[cfg(feature = "services-redis")]
-    registry.register::<crate::services::Redis>(crate::services::REDIS_SCHEME);
-    #[cfg(feature = "services-rocksdb")]
-    
registry.register::<crate::services::Rocksdb>(crate::services::ROCKSDB_SCHEME);
-    #[cfg(feature = "services-s3")]
-    registry.register::<crate::services::S3>(crate::services::S3_SCHEME);
-    #[cfg(feature = "services-seafile")]
-    
registry.register::<crate::services::Seafile>(crate::services::SEAFILE_SCHEME);
-    #[cfg(feature = "services-sftp")]
-    registry.register::<crate::services::Sftp>(crate::services::SFTP_SCHEME);
-    #[cfg(feature = "services-sled")]
-    registry.register::<crate::services::Sled>(crate::services::SLED_SCHEME);
-    #[cfg(feature = "services-sqlite")]
-    
registry.register::<crate::services::Sqlite>(crate::services::SQLITE_SCHEME);
-    #[cfg(feature = "services-surrealdb")]
-    
registry.register::<crate::services::Surrealdb>(crate::services::SURREALDB_SCHEME);
-    #[cfg(feature = "services-swift")]
-    registry.register::<crate::services::Swift>(crate::services::SWIFT_SCHEME);
-    #[cfg(feature = "services-tikv")]
-    registry.register::<crate::services::Tikv>(crate::services::TIKV_SCHEME);
-    #[cfg(feature = "services-upyun")]
-    registry.register::<crate::services::Upyun>(crate::services::UPYUN_SCHEME);
-    #[cfg(feature = "services-vercel-artifacts")]
-    
registry.register::<crate::services::VercelArtifacts>(crate::services::VERCEL_ARTIFACTS_SCHEME);
-    #[cfg(feature = "services-vercel-blob")]
-    
registry.register::<crate::services::VercelBlob>(crate::services::VERCEL_BLOB_SCHEME);
-    #[cfg(feature = "services-webdav")]
-    
registry.register::<crate::services::Webdav>(crate::services::WEBDAV_SCHEME);
-    #[cfg(feature = "services-webhdfs")]
-    
registry.register::<crate::services::Webhdfs>(crate::services::WEBHDFS_SCHEME);
-    #[cfg(feature = "services-yandex-disk")]
-    
registry.register::<crate::services::YandexDisk>(crate::services::YANDEX_DISK_SCHEME);
-}
-
 /// Factory adapter that builds an operator from a configurator type.
 fn factory<C: Configurator>(uri: &OperatorUri) -> Result<Operator> {
     let cfg = C::from_uri(uri)?;

Reply via email to