一,以实际案例引入阿里云的运用数据库
好多人都在玩概念,玩什么概念,好比工业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作的比这个更靓哦!
若是你们感受赞,就动动手指帮我点一下推荐吧!谢谢您能看到这儿。