目前只做了基礎的功能,比如:
各個模塊單獨的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</Required Service>//此模塊需要依賴哪些其他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>< br> <Manifest>D:\documents\visual studio 2010 \Projects\OSGIDemo\OrderPDFProcessor\bin\Debug\Manifest.xml</Manifes t>
</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; }
查看本欄目