多模塊后帶來的問題解決方法 - OSGI原形(.NET)


目前只做了基礎的功能,比如:

  1. 各個模塊單獨的AppDomain容器
  2. Activator激活
  3. 導出的服務檢查

不過,雖說這樣,但目前的這個版本已經能實現模塊分離、互相依賴調用等功能了,對模塊划分已經有很好的作用了。

先來說下基本結構:

 

目前這個框架對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隔離的,性能上肯定下降。

代碼下載 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM