一,以實際案例引入阿里雲的運用數據庫
好多人都在玩概念,玩什麼概念,好比工業4.0服務器
什麼叫工業4.0,簡單一點理解就是 「互聯網」 + 「製造」(互聯網+)。再通俗一些的理解就是「互聯網」作電商銷售,「製造」就是傳統生產。多線程
最終作到有了訂單才生產,真正作到了按需生產,解決了企業物料損耗,庫存堆積等問題。架構
好比:以印刷廠爲案例來講工業4.0,一個印刷廠,客戶下單才印刷,不能先印刷一堆東西堆在庫存裏吧!app
先能夠看一個流程示意圖:框架
1,客戶經過銷售平臺下單(印刷數量,規格,付款,以及上傳須要印刷的文件,與普通電商銷售平臺的區別體如今上傳文件這兒)分佈式
2,經過一個服務(ESB),把客戶的訂單信息,文件數據流轉到印刷廠的生產系統。ide
今天我重點要說的就是ESB服務,怎樣高效穩定的把文件從銷售平臺轉到生產系統。學習
需求:ui
1,由於訂單量大,天天有2至3T的文件從銷售平臺流向生產系統。
2,這些文件至少要保存一個月左右,有可能返工印刷(算下來企業最小極限要有100個T的存儲服務器)。
通過多方面的考慮,建議選擇阿里雲的存儲。
二,阿里雲存儲OSS的開發
1,支持目錄結構的文件,普通文件的傳輸。
2,銷售平臺端上傳文件到阿里雲服務器,支持多線程的(分塊上傳,分塊校驗,斷點續傳,重試,文件MD5值檢驗,進度,速度,須要用時的顯示)
3,ESB服務從阿里雲服務器下載文件,支持多線程的(分塊下載,分塊校驗,斷點續傳,重試,文件MD5值檢驗,進度,速度,須要用時的顯示)
4,把下載的文件通過一系統的預檢,處理,最終拷貝到生產系統。
5,反饋文件處理結果到銷售平臺,生產系統。
這幾個需求促使咱們有必要開發一個個性化的阿里雲客戶端,這個客戶端已經知足了我上面說的的需求。
三,具體開發介紹
3.1程序目錄結構的介紹
先上圖,再來解釋。
無論會不會寫程序的,只要是懂點IT的,聊到程序時,都會聊到點架構。落伍一些的就聊「三層架構」,牛批一些的就聊「分佈式架構」,在博客園裏都能找到上十種的架構。
在這兒,我就不畫架構圖了,就以目錄來講個人程序架構。
顯而易見:
這個程序最底層的架構:服務端 + 客戶端。
服務端:數據庫的持久化操做,和一些公用接口,好比獲取服務器時間服務。
客戶端:UI的數據呈現,下載,文件處理等的業務邏輯。
其中客戶端又包含了一個UI框架:
這個框架是MVVM模式,至關於B/S結構中的MVC。
這個UI框架:
1,實現了XAML與C#代碼的分離
2,實如今IOC的控制反轉的模式
3,利用觀察者模板實現了模塊與模塊之間的解耦
3.2關鍵核心的架構代碼:
代碼片斷1:
由於整個程序,各個程序之間互相不添加引用,只要在生成項目的時候用這樣的命令把dll文件拷貝到UI框架目錄下便可
xcopy $(TargetPath) $(SolutionDir)FileTransfer.Client\bin\Debug /y
xcopy $(TargetPath) $(SolutionDir)FileTransfer.Client\bin\Release /y
具休操做如圖所示:
代碼片斷2:
由於UI啓動程序不添加各dll的引用,目的是使每一個功能模板之間的解耦合,因此在啓動程序時,須要添加一段引導代碼:
public class AppBootstrapper : BootstrapperBase { private CompositionContainer container; public AppBootstrapper() { Initialize(); } protected override void BuildUp(object instance) { this.container.SatisfyImportsOnce(instance); } /// <summary> /// By default, we are configured to use MEF /// </summary> protected override void Configure() { foreach (var file in System.IO.Directory.GetFiles(System.IO.Directory.GetCurrentDirectory(), "FileTransfer.*.dll")) { AssemblySource.Instance.Add(Assembly.LoadFile(file)); } var catalog = new AggregateCatalog( AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()); this.container = new CompositionContainer(catalog); var batch = new CompositionBatch(); batch.AddExportedValue<IWindowManager>(new WindowManager()); batch.AddExportedValue<IEventAggregator>(new EventAggregator()); batch.AddExportedValue(this.container); batch.AddExportedValue(catalog); this.container.Compose(batch); } protected override IEnumerable<object> GetAllInstances(Type serviceType) { return this.container.GetExportedValues<object>(AttributedModelServices.GetContractName(serviceType)); } protected override object GetInstance(Type serviceType, string key) { var contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(serviceType) : key; var exports = this.container.GetExportedValues<object>(contract); if (exports.Any()) { return exports.First(); } throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract)); } protected override void OnStartup(object sender, StartupEventArgs e) { //var startupTasks = // GetAllInstances(typeof(StartupTask)) // .Cast<ExportedDelegate>() // .Select(exportedDelegate => (StartupTask)exportedDelegate.CreateDelegate(typeof(StartupTask))); //startupTasks.Apply(s => s()); DisplayRootViewFor<FileTransfer.Interface.IShell>(); //base.OnStartup(sender, e); } }
這個引導代碼有一個很關鍵的地方,我把它提煉出來:
foreach (var file in System.IO.Directory.GetFiles(System.IO.Directory.GetCurrentDirectory(), "FileTransfer.*.dll")) { AssemblySource.Instance.Add(Assembly.LoadFile(file)); }
就是要把須要的dll,經過必定規則的匹配模式把dll放入到程序的容器中。經過如下的代碼來獲取實例:
object obj = IoC.Get<IRetrievePwd>(); IoC.Get<IWindowManager>().ShowDialog(obj);
代碼片斷3:
觀察者模式的實現:
觀察者模式,首先,咱們確定要明白有兩個對象,一個是發佈信息,一個是接收信息,同時還須要一個契約。以下代碼:
PublishTaskViewModel ptvm = (PublishTaskViewModel)IoC.Get<IPublishTask>(); ptvm.TaskViewData = taskData; ptvm.OperateType = OperateTypeEnum.Edit; _eventAggregator.PublishOnUIThread(new ShowMainContentEvent { ContentModel = ptvm });
其中:
IPublishTask 就是我定義的觀察者模式契約。
PublishOnUIThread 就是我發出一條消息,發出消息的模式有不少種,以下圖:
訂閱對象要實現:
this._eventAggregator.Subscribe(this);
再用這樣的方法接收信息:
public void Handle(ShowMainContentEvent message) { }
四,結語
一言難盡,還有不少不少要寫的地方。這個給公司開發的代碼,又不能共享,只能多分享。
若是你們想學習我這套開發框架構,我也有相似的開源程序,麻煩翻一翻個人博客,有一篇程序寫了一個軟件,就是用的這個架構。而且UI作的比這個更靚哦!
若是你們感受贊,就動動手指幫我點一下推薦吧!謝謝您能看到這兒。