當類別依賴服務時,直接引用會造成耦合、生命週期管理分散、編譯期需具體實現。Service Locator 集中創建與管理服務,優點:
.NET 內建 System.ComponentModel.Design.ServiceContainer 即為簡易實現,內部用 Hashtable 映射型別與實例。
Prism 無專屬 Service Locator,直接以 DI 容器(IUnityContainer)作為服務定位器。RegisterType 對應 AddService,Resolve 對應 GetService。
預設載入下列服務(除非 Run(false)):
IModuleEnumerator:模組枚舉器(必須自行提供具體實現)IContainerFacade:容器外觀IEventAggregator:事件聚合器RegionAdapterMappings:Region 適配器映射IRegionManager:Region 管理器IModuleLoader:模組載入器三種模組枚舉器:StaticModuleEnumerator、DirectoryLookupModuleEnumerator、ConfigurationModuleEnumerator。
基礎共享服務:於 Bootstrapper.ConfigureContainer 註冊。
模組專屬服務:於模組 Initialize 中註冊,隨模組載入才註冊,達到延遲載入效果。
// Bootstrapper
protected override void ConfigureContainer() {
Container.RegisterType<IMyService, MyService>();
base.ConfigureContainer();
}
// Module
public class MyModule : IModule {
private readonly IUnityContainer _container;
public MyModule(IUnityContainer container) { _container = container; }
public void Initialize() { _container.RegisterType<IMyService, MyService>(); }
}
註:Prism 內部使用 IContainerFacade 抽象容器,但應用層建議直接用 IUnityContainer 以獲得完整功能(註冊、解析等),除非需支援多容器。