阿⾥云客户端的实现(⽀持⽂件分块,断点续传,进度,速度,倒计
时显⽰)
⼀,以实际案例引⼊阿⾥云的运⽤
好多⼈都在玩概念,玩什么概念,⽐如⼯业4.0
什么叫⼯业4.0,简单⼀点理解就是 “互联⽹” + “制造”(互联⽹+)。再通俗⼀些的理解就是“互联⽹”做电商销售,“制造”就是传统⽣产。
最终做到有了订单才⽣产,真正做到了按需⽣产,解决了企业物料损耗,库存堆积等问题。
⽐如:以印刷⼚为案例来说⼯业4.0,⼀个印刷⼚,客户下单才印刷,不能先印刷⼀堆东西堆在库存⾥吧!
先可以看⼀个流程⽰意图:
1,客户通过销售平台下单(印刷数量,规格,付款,以及上传需要印刷的⽂件,与普通电商销售平台的区别体现在上传⽂件这⼉)
2,通过⼀个服务(ESB),把客户的订单信息,⽂件数据流转到印刷⼚的⽣产系统。
今天我重点要说的就是ESB服务,怎样⾼效稳定的把⽂件从销售平台转到⽣产系统。
需求:
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();
mvc的三层架构}
protected override void BuildUp(object 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>());
var batch = new CompositionBatch();
batch.AddExportedValue<IWindowManager>(new WindowManager());
batch.AddExportedValue<IEventAggregator>(new EventAggregator());
batch.ainer);
batch.AddExportedValue(catalog);
}
protected override IEnumerable<object> GetAllInstances(Type serviceType)
{
ainer.GetExportedValues<object>(AttributedModelServices.GetContractName(serviceType));
}
protected override object GetInstance(Type serviceType, string key)
{
var contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(serviceType) : key;
var exports = ainer.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);
}
}
View Code
这个引导代码有⼀个很关键的地⽅,我把它提炼出来:
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 做的⽐这个更靓哦!
如果⼤家感觉赞,就动动⼿指帮我点⼀下推荐吧!谢谢您能看到这⼉。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。