MIS - 模組介面服務(Module Interface Service)
模組A對外暴露SDK(介面+資料Model),在執行時,通過介面將對應的介面服務註冊到服務容器中。
模組B引用模組A對外暴露的SDK,通過SDK中的介面在服務容器中查詢對應的介面服務並呼叫。
基於上述,MIS需要解決的問題:
- 模組如何對外暴露SDK
- 如何通過介面查詢對應的介面服務
模組如何對外暴露SDK
這裡所述的SDK對應的就是一個jar包,其實就是Android module中,打一個包含介面和資料model的jar包。
如何通過介面查詢對應的服務
維護一個Map,介面為key, 對應的介面服務為value,是不是就可以了?
Usage
引用 mis 外掛
在根專案的build.gradle中新增 mis 外掛的引用:
buildscript {
dependencies {
classpath 'com.eastwood.tools.plugins:mis:1.1.0'
}
}
複製程式碼
在模組的build.gradle中新增mis 外掛:
apply plugin: 'mis'
複製程式碼
建立 mis 目錄
在src/main/java 同級目錄,建立mis資料夾
定義介面和資料Model,實現對應介面服務
直接在mis資料夾下,建立對應的包名、介面類和資料Model(即對外暴露SDK)。並在java資料夾下,實現對應的介面服務。
宣告當前模組的sdk
在模組 build.gradle 中dependencies中,通過 misSource
宣告,例如:
dependencies {
...
implementation misSource(
group: 'com.eastwood.demo',
name: 'library-sdk'
// version: 1.0.0 // 上傳maven時指定版本號
)
}
複製程式碼
註冊服務
在模組build.gradle中新增mis服務容器庫引用:
dependencies {
implementation 'com.eastwood.common:mis:1.0.0'
}
複製程式碼
然後,在MisService(服務容器)註冊服務,可以使用 服務介面 + 服務介面的實現物件 或 服務介面的實現類 進行註冊,例如:
// 服務介面 + 服務介面的實現物件
MisService.register(ILibraryService.class, new LibraryService());
// 服務介面 + 服務介面的實現類
MisService.register(ILibraryService.class, LibraryService.class);
複製程式碼
獲取服務
在其他模組build.gradle中新增mis庫,以及通過 misProvider
引用sdk:
dependencies {
implementation 'com.eastwood.common:mis:1.0.0'
implementation misProvider('com.eastwood.demo:library-sdk')
}
複製程式碼
Sync後,就可以通過介面在MisService服務容器中查詢對應的介面服務並呼叫,例如:
ILibraryService libraryService = MisService.getService(ILibraryService.class);
libraryService.getLibraryInfo()
複製程式碼
上傳Maven
介面除錯結束後,需將mis
資料夾打包上傳至Maven。
配置 Maven
在根專案的 build.gradle 或 模組 build.gradle 中新增配置:
apply plugin: 'mis-maven'
misMaven {
username = '使用者名稱'
password = '密碼'
repository = 'maven上對應的倉庫地址'
snapshotRepository = 'maven上對應的快照倉庫地址'
}
複製程式碼
配置 GAV
dependencies {
...
implementation misSource(
group: 'com.eastwood.demo',
name: 'library-sdk'
version: 1.0.0 // 上傳maven時必須指定版本號,支援'version-SNAPSHOT'
)
}
複製程式碼
除了GAV等必配項,還有以下配置:
-
dependencies String[] 型別
若上傳的sdk引用其他類庫,需配置對應的GAV,例如:
dependencies { ... implementation misSource( group: 'com.eastwood.demo', name: 'library-sdk', version: '1.0.0', dependencies = ['com.google.code.gson:gson:2.8.1'] ) } 複製程式碼
另外,在MicroModule目錄結構下的配置
dependencies {
...
implementation misSource(
group: 'com.eastwood.demo',
name: 'library-sdk',
version: '1.0.0',
microModuleName: '**microModule name**',
dependencies = ['com.google.code.gson:gson:2.8.1']
)
}
複製程式碼
執行上傳Task
開啟Gradle Tasks View,在對應專案執行上傳任務。
- publishMis[...]PublicationToMavenRepository 對應上傳至repository
- publishMis[...]PublicationToMavenSnapshotRepository 對應上傳至snapshotRepository
上傳成功之後,需指定或更新 misProvider
中的version。
dependencies {
implementation 'com.eastwood.common:mis:1.0.0'
implementation misProvider('com.eastwood.demo:library-sdk:1.0.0')
}
複製程式碼
QA
1. 沒有Maven私服,怎麼辦?
不指定misSource 和 misProvider 中的version。
複製程式碼
最後
MIS已經上傳至Github,歡迎star交流。 github.com/EastWoodYan…