目前只做了基礎的功能,比如:
- 各個模塊單獨的AppDomain容器
- Activator激活
- 導出的服務檢查
不過,雖說這樣,但目前的這個版本已經能實現模塊分離、互相依賴調用等功能了,對模塊划分已經有很好的作用了。
先來說下基本結構:
目前這個框架對UI的模塊化尚不支持,只支持單機下的模塊加載(以后會改進)。
特點:
- Runtime、Module1、Module2、Module3都是在各自的AppDomain下運行的,不會互相干擾
- 由於采用了隔離AppDomain的方式加載Module,所以能實現輕松卸載AppDomain、某dll、dll版本切換之類的任務,對后續擴展提供了方便
來看看模塊的編寫
OrderModule庫是主要的業務邏輯以及模塊定義的地方
OrderModule.PublicInterfaces是公用定義,比如接口、事件、dto等,考慮到方便分發,因此獨立了出來(如果不介意這點,也可以合並成一個庫)
模塊定義文件:
<?xml version="1.0" encoding="utf-8" ?> <Module> <Name>Order Module</Name> <Version>1</Version> <Assembly>OrderModule</Assembly> <Activator>OrderModule.Activator</Activator> //這個是OSGI調用的第一個classType, 會執行里面的2個方法:Start和Stop <RequiredService>LoggingModule.PublicInterfaces.ILog</RequiredService>//此模塊需要依賴哪些其他Service,可以有多個 <ProvidedService>OrderModule.PublicInterfaces.IOrderProcessor</ProvidedService>//此模塊會提供的服務,可以有多個 </Module>
Activator:
class Activator:OSGIFramework.BundleActivator { public override void Startup(BundleContext bc) { Console.WriteLine("OrderModule Startup"); BundleContext.Current.RegisterProvidedService<IOrderProcessor, OrderProcessorImpl>();
//注冊服務 } public override void Stop(BundleContext bc) { Console.WriteLine("OrderModule Stop"); BundleContext.Current.UnRegisterProvidedService<IOrderProcessor, OrderProcessorImpl>();
//卸載服務 } }
服務的實現:
class OrderProcessorImpl : ServiceProvider, IOrderProcessor //ServiceProvider是基類,由於需要在AppDomain之間穿梭,因此必須繼承這個 { public Guid PlaceOrder(OrderModule.PublicInterfaces.Dtos.OrderDto order) { BundleContext ctx=BundleContext.Current; //獲得上下文 ILog log = ctx.GetProvidedService<ILog>(); //獲得一個服務 log.Log("log something..."); Console.WriteLine("PlaceOrder body"); return Guid.NewGuid(); } }
模塊化,還要考慮散落在不同目錄的dll文件和xml定義文件。在Console程序中,也可以通過xml定義格式來做:
<?xml version="1.0" encoding="utf-8" ?> <Manifests> <Manifest>D:\documents\visual studio 2010\Projects\OSGIDemo\LoggingModule\bin\Debug\Manifest.xml</Manifest> <Manifest>D:\documents\visual studio 2010\Projects\OSGIDemo\OrderModule\bin\Debug\Manifest.xml</Manifest> <Manifest>D:\documents\visual studio 2010\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; }
就可以運行了,效果圖:
當然,由於是AppDomain隔離的,性能上肯定下降。
代碼下載