WPF+MVVM(Caliburn.Micro)项目框架
2023年7月19日发(作者:)
WPF+MVVM()项⽬框架 最近做了⼀个软件,这个软件不是⽹站,但是与HTML,AJAX等技术密切相关,也不是只有单纯的数据库增删改查,还涉及到线程协调,⽐较复杂的⽂本处理…… 这样的软件,⽤OA,ERP的框架显然是不合适的,因为这种软件⽤不上权限管理,⼯作流这些技术。但是软件⼜要操作数据库。 介于这些的特殊性,想来想去,还是⾃⼰搭建⼀个轻量级的软件框架是⽐较好的。⼀:C/S与B/S的选择1,我做的是⼀个购物⽹站的刷单软件,有如下⼏个⽅⾯的原因,我选择了C/S程序a,刷单软件需要长时间的运⾏,不定时,不间断的去访问购物⽹站。b,有时候有多个线程的需要。c,程序运⾏时,需要操作本地⽂件的权限,要把关键页⾯截图(如添加收藏,货⽐三家)保存到本地,然后上传到服务器。d,C#的Httpresponse,HttpRequest对象运⾏在不同的电脑上,有不同的外⽹IP,如果做成⽹站,Httpresponse,HttpRequest永远只是在服务器上运⾏,外⽹IP只有⼀个。2,在桌⾯运⽤程序⽅⾯,我感觉⽤WPF要⽐⽤WinForm好。a,WPF的UI做出的产品肯定要⽐WinForm专业,这⼀点是谁都不能否认的。b,WPF技术运⽤了XAML语法,这个⽐WinForm好⽤。c,WPF可以⽤到MVVM模式,这点WinForm是永远都做不到的,并且MVVM有⽐较成熟的产品(MVVMLight,,Prism)等产品在这⼉选⽤的是框架,优点在于有命名的⾃动匹配,发布/订阅的消息模式,IOC的解耦,我举两个例⼦说明⼀下吧:例⼀,IOC创建对象我的项⽬ ent 要⽤到 inessPart 的页⾯,正常情况下 ent 要添加项⽬inessPart的引⽤。但是⽤是不⽤添加引⽤的。只添要在引导程序中中的配置加添加如下代码:protected override void Configure(){ foreach (var file in es(rentDirectory(), "Trade.*.dll")) { (le(file)); } var catalog = new AggregateCatalog( (x => new AssemblyCatalog(x)).OfType()); ner = new CompositionContainer(catalog); var batch = new CompositionBatch(); ortedValue(new WindowManager()); ortedValue(new EventAggregator()); ortedValue(ner); ortedValue(catalog); e(batch);}在使⽤的时候,⽤IOC的⽅式创建对象:UserCenterViewModel userCenter = (UserCenterViewModel)();bool? userCenterVal = ().ShowDialog(userCenter);根本就不⽤引⽤⼀个类库,然后new⼀个对象。做到了⾼内聚,低耦合的原则。
例⼆:发布/订阅模式编先要定义⼀个接⼝,我的项⽬是以 terface 这个类库作为我的接⼝库类。在发布页⾯: ⽅法⼀是同步UI发布事件, ⽅法⼆是新开⼀个Task来发布⼀个事件。也就是异步发布事件。然后在另外⼀个页⾯接收这个发布的事件:这样就实现了两个类库之间互相不添加引⽤的情况下,把消息通知给另外⼀个类库。⼆:数据库的持久化操作数据库持久化操作经历了很多阶段,1,SqlHelper阶段2,enterprise library阶段3,Ibatis,Dapper阶段4,Linq, Nhibernate, EntityFramework阶段。这⼏种操作,我在实战项⽬中都使⽤过,犹其是EntityFramework,不管是Code Frist 模式,Mode First模式,还是Data First模式,好⼏年前就⽤在项⽬中做过⽐较了。但是我最认可的还是Dapper。来⼀段码:/// /// 根据⽤户ID获取⽤户的相关信息/// /// /// /// public TradeUserModel GetTradeUserByUserID(DataContextBase dContext, String userID){ TradeUserModel result = default(TradeUserModel); String querySql = @"select * from TradeUser where UserID = @UserID; select ROW_NUMBER() over (order by DoBindingDTime desc) as RowNo, * from Member where IsDelete = '0' and UserID = @UserID; select * from Member where IsDelete = '0' and IsCurrent = '1' and UserID = @UserID "; var multi = ultiple(querySql, new { UserID = userID }, ction); result = ().FirstOrDefault(); List memberList = ().ToList(); MemberModel currentMember = ().FirstOrDefault(); List = new ObservableCollection(memberList); MoneyRepository moneyRepository = new MoneyRepository(); decimal totalMoneyIn = inessMoneyByUserID(dContext, userID, "In", new string[] { "RechargeMoney", "" }); decimal totalMoneyOut = inessMoneyByUserID(dContext, userID, "Out", new string[] { "TakeMoney", "TaskOut", }); decimal totalTransferMoneyIn = inessMoneyByUserID(dContext, userID, "In", new string[] { "TransferMoneyIn", "" }); decimal totalTransferMoneyOut = inessMoneyByUserID(dContext, userID, "Out", new string[] { "TransferMoneyOut", "" }); nableMoney = totalMoneyIn + totalMoneyOut; otEnableMoney = 0; ransferMoney = totalTransferMoneyIn + totalTransferMoneyOut; tMember = currentMember; // currentMember ?? new MemberModel(); return result;}我⼀段Sql执⾏了三个查询,⽤QueryMultiple取得不同的查询结果,最神奇的地⽅,是查询出来的字段,不⽤⼿动赋值,Dapper可以⾃动实现。⽐如public List GetInvitationCollectionByOwner(DataContextBase dContext, InvitationModel invitationData){ List result = default(List); String querySql = @"select ROW_NUMBER() over (order by CreateDTime desc) as RowNo , me as OwnerInfoName, me as ComputerUniqueName, i.* from Invitation i left join TradeUser tu1 on nfo = left join TradeUser tu2 on erUnique = where OwnerInfo = @OwnerInfo;"; result = (querySql, invitationData, ction).ToList(); return result;}这样的我查询结果就直接 赋值给 InvitationModel 类了。这样的我查询结果就直接 赋值给 InvitationModel 类了。三:项⽬中实体对象的共⽤理论上,应该要申明⼀个类与表的字段对应如果是⽤WCF作为通信传输,还得声明⼀个DataContract 数据契约类如果是⽤的MVVM框,还得要有⼀个ViewModel类三个类这间,要转换赋值,有类似 automapper 这样的⼯具,但是我还是不建议转换去,转换来的。我直接把这个三个不同地⽅的类给共⽤起来。⽐如我的实体类如下:[DataContract]public class LogModel : NotifyPropertyChanged{ private Guid _logID; [DataMember] public Guid LogID { get { return _logID; } set { _logID = value; OnPropertyChanged("LogID"); } }……1,可以运作WCF的数据契约传输,2,还可以作为MVVM的ViewModel3,还可以与数据库字段在ORM时相互映射⼀箭三雕啊结语:这个项⽬还运⽤到了很多技术,如如线程的管理,解析⽹页(⽹页异步加载情下)是怎么处理的?等下⼀篇博客再说。如果对这个软件感觉兴趣的,可看上⼀篇博客。谢谢!
发布者:admin,转转请注明出处:http://www.yc00.com/news/1689718124a280680.html
评论列表(0条)