目前只做了基礎的功能,比如:
各個模塊單獨的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;
}
查看本欄目