程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .NET中多模塊後帶來的問題解決方法:OSGI原形

.NET中多模塊後帶來的問題解決方法:OSGI原形

編輯:關於.NET

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

各個模塊單獨的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;
        }

查看本欄目

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved