本文深入剖析 OSGi 原型的核心運行機制:AppDomain 隔離容器、BundleActivator 生命週期、服務註冊發現、相依注入解析,以及 XML 設定驅動的模組載入流程。


OrderModule:業務邏輯與模組定義OrderModule.PublicInterfaces:介面、事件、DTO 定義 (獨立部署)LoggingModule、OrderPDFProcessor:其他功能模組<?xml version="1.0" encoding="utf-8"?>
<Module>
<Name>Order Module</Name>
<Version>1</Version>
<Assembly>OrderModule</Assembly>
<Activator>OrderModule.Activator</Activator>
<RequiredService>LoggingModule.PublicInterfaces.ILog</RequiredService>
<ProvidedService>OrderModule.PublicInterfaces.IOrderProcessor</ProvidedService>
</Module>
public class Activator : OSGIFramework.BundleActivator
{
public override void Startup(BundleContext bc)
{
Console.WriteLine("OrderModule Startup");
BundleContext.Current.RegisterProvidedService();
}
public override void Stop(BundleContext bc)
{
Console.WriteLine("OrderModule Stop");
BundleContext.Current.UnRegisterProvidedService();
}
}
public class OrderProcessorImpl : ServiceProvider, IOrderProcessor
{
public Guid PlaceOrder(OrderDto order)
{
BundleContext ctx = BundleContext.Current;
ILog log = ctx.GetProvidedService(); // 相依解析
log.Log("log something...");
Console.WriteLine("PlaceOrder body");
return Guid.NewGuid();
}
}
<?xml version="1.0" encoding="utf-8"?>
<Manifests>
<Manifest>D:\Projects\OSGIDemo\LoggingModule\bin\Debug\Manifest.xml</Manifest>
<Manifest>D:\Projects\OSGIDemo\OrderModule\bin\Debug\Manifest.xml</Manifest>
<Manifest>D:\Projects\OSGIDemo\OrderPDFProcessor\bin\Debug\Manifest.xml</Manifest>
</Manifests>
static void Main(string[] args)
{
BundleRuntime runtime = new BundleRuntime();
runtime.Start();
BundleContext ctx = BundleContext.Current;
IOrderProcessor processor = (IOrderProcessor)ctx.GetProvidedService(typeof(IOrderProcessor).FullName);
OrderDto order = new OrderDto();
Guid id = processor.PlaceOrder(order);
Console.WriteLine("id=" + id.ToString());
Console.ReadKey();
runtime.Stop();
runtime.Dispose();
runtime = null;
}
| 類別 | 職責 |
|---|---|
| BundleRuntime | 解析 Manifests.xml、建立 AppDomain、載入組件、實例化 Activator、啟動/停止協調 |
| BundleContext | 服務註冊表、相依解析、當前模組上下文、跨 AppDomain 代理管理 |
| BundleActivator | 模組生命週期進入點 (Startup/Stop) |
| ServiceProvider | 跨 AppDomain 封送基類 (繼承 MarshalByRefObject) |
查看本欄目