软件框架

软件框架

最近做了一个软件,这个软件不是网站,但是与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, Caliburn.Micro,Prism)等产品

在这儿选用的是Caliburn.Micro框架,优点在于有命名的自动匹配,发布/订阅的消息模式,IOC的解耦,我举两个例子说明一下吧:

例一,IOC创建对象

我的项目 Trade.WPFClient  要用到  Trade.WPFBusinessPart 的页面,正常情况下 Trade.WPFClient  要添加项目 Trade.WPFBusinessPart的引用。

但是用Caliburn.Micro是不用添加引用的。

只添要在引导程序中AppBootstrapper.cs中的配置加添加如下代码:

protected override void Configure()
{
    foreach (var file in System.IO.Directory.GetFiles(System.IO.Directory.GetCurrentDirectory(), "Trade.*.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);
}

在使用的时候,用IOC的方式创建对象:

UserCenterViewModel userCenter = (UserCenterViewModel)IoC.Get<IUserCenter>();
bool? userCenterVal = IoC.Get<IWindowManager>().ShowDialog(userCenter);

根本就不用引用一个类库,然后new一个对象。做到了高内聚,低耦合的原则。

例二:发布/订阅模式编

先要定义一个接口,我的项目是以 Trade.BaseInterface  这个类库作为我的接口库类。

在发布页面:

方法一是同步UI发布事件,

方法二是新开一个Task来发布一个事件。也就是异步发布事件。

然后在另外一个页面接收这个发布的事件:

这样就实现了两个类库之间互相不添加引用的情况下,把消息通知给另外一个类库。

二:数据库的持久化操作

数据库持久化操作经历了很多阶段,

1,SqlHelper阶段

2,enterprise library阶段

3,Ibatis,Dapper阶段

4,Linq, Nhibernate, EntityFramework阶段。

这几种操作,我在实战项目中都使用过,犹其是EntityFramework,不管是Code Frist 模式,Mode First模式,还是Data First模式,好几年前就用在项目中做过比较了。

但是我最认可的还是Dapper。

来一段码:

/// <summary>
/// 根据用户ID获取用户的相关信息
/// </summary>
/// <param name="dContext"></param>
/// <param name="userID"></param>
/// <returns></returns>
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 = dContext.Connection.QueryMultiple(querySql, new { UserID = userID }, dContext.Transaction);
    result = multi.Read<TradeUserModel>().FirstOrDefault();
    List<MemberModel> memberList = multi.Read<MemberModel>().ToList();
    MemberModel currentMember = multi.Read<MemberModel>().FirstOrDefault();
    result.MemberList = new ObservableCollection<MemberModel>(memberList);
    MoneyRepository moneyRepository = new MoneyRepository();
    decimal  totalMoneyIn = moneyRepository.GetBusinessMoneyByUserID(dContext, userID, "In", new string[] { "RechargeMoney", "" });
    decimal totalMoneyOut = moneyRepository.GetBusinessMoneyByUserID(dContext, userID, "Out", new string[] { "TakeMoney", "TaskOut", });
    decimal totalTransferMoneyIn = moneyRepository.GetBusinessMoneyByUserID(dContext, userID, "In", new string[] { "TransferMoneyIn", "" });
    decimal totalTransferMoneyOut = moneyRepository.GetBusinessMoneyByUserID(dContext, userID, "Out", new string[] { "TransferMoneyOut", "" });
    result.TotalEnableMoney = totalMoneyIn + totalMoneyOut;
    result.TotalNotEnableMoney = 0;
    result.TotalTransferMoney = totalTransferMoneyIn + totalTransferMoneyOut;
    result.CurrentMember = currentMember; // currentMember ?? new MemberModel();
    return result;
}

我一段Sql执行了三个查询,用QueryMultiple取得不同的查询结果,最神奇的地方,是查询出来的字段,不用手动赋值,Dapper可以自动实现。比如

public List<InvitationModel> GetInvitationCollectionByOwner(DataContextBase dContext, InvitationModel invitationData)
{
    List<InvitationModel> result = default(List<InvitationModel>);
    String querySql = @"select ROW_NUMBER() over (order by CreateDTime desc) as RowNo
                        , tu1.UserName as OwnerInfoName, tu2.UserName as ComputerUniqueName, i.* from Invitation i
                        left join TradeUser tu1 on i.OwnerInfo = tu1.UserID
                        left join TradeUser tu2 on i.ComputerUnique = tu2.UserID
                        where OwnerInfo = @OwnerInfo;";
    result = dContext.Connection.Query<InvitationModel>(querySql, invitationData, dContext.Transaction).ToList();
    return result;
}

这样的我查询结果就直接 赋值给 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的ViewModel

3,还可以与数据库字段在ORM时相互映射

一箭三雕啊

结语:

这个项目还运用到了很多技术,如如线程的管理,解析网页(网页异步加载情下)是怎么处理的?

等下一篇博客再说。

如果对这个软件感觉兴趣的,可看上一篇博客。谢谢!

时间: 2025-01-01 14:03:42

软件框架的相关文章

[Alljoyn] 1、物联网开源软件框架alljoyn研究(一)——初步了解

What is AllJoyn?[是一个合作的开源软件框架目的在于连接万物] An Open Source API Framework For the Internet of EverythingA way devices and applications publish APIs over a network in a standard wayWhy APIs?– Because this is what software developers understand and work with

TI BLE协议栈软件框架分析

看源代码的时候,一般都是从整个代码的入口处开始,TI  BLE 协议栈源码也不例外.它的入口main()函数就是整个程序的入口,由系统上电时自动调用. 它主要做了以下几件事情: (一)底层硬件初始化配置 (二)创建任务并初始化任务配置 (三)检测并执行有效的任务事件 Main() 函数源码如下: 一:底层硬件初始化设置 75行,设置系统时钟,使能内存缓冲功能. 78行,关中断,刚启动时,系统运行不稳定,一般会首先关中断. 81行,硬件相关的I/O 口配置. 84行,初始化mcu 内部的flash

Mindjet MindManager 思维导图软件-使用思维导图跟踪调用流程,绘制软件框架

思维导图.据说是每一个产品经理必备的软件.假设你阅读大型源码.使用思维导图跟踪调用流程,绘制软件框架将会很方便. 特点:没什么好说的.用过的都说好. 软件截图: 下载:http://www.mindmanager.cc/ MindManager新手新手教程 MindManager是一款创造.管理和交流思想的思维导图软件,其直观清晰的可视化界面和强大的功能能够高速捕捉.组织和共享思维.想法.资源和项目进程等等.MindManager新手新手教程专为新手用户设计,包括创建思维导图基本入门操作,让用户

Niagara解决设备连接应用的软件框架平台技术。

Niagara 是Tridium公司所研发的设计用于解决设备连接应用的软件框架平台技术. Niagara是一种应用框架,或者说是软件框架,特别设计用于应对智能设备所带来的各种挑战,包括设备连接到企业级的应用,支持互联网的产品和基于互联网自动化系统的开发. 应用框架是一个软件工程中的概念,不同于普通的软件,它是用于实现某应用领域通用完备功能的底层服务,使用这种框架的编程人员可以在一个通用功能已经实现的基础上开始具体的产品和系统开发.应用框架强调的是软件的设计重用性和系统的可扩展性,以缩短各种应用软

软件框架和软件架构的区别?

初学java,遇到jdk,sdk概念:软件开发工具包(外语首字母缩写:SDK.外语全称:Software Development Kit)一般都是一些软件工程师为特定的软件包.软件框架.硬件平台.操作系统等建立应用软件时的开发工具的集合. 软件包:(SoftWare Package)是指具有特定的功能,用来完成特定任务的一个程序或一组程序. 开发工具:包含编辑.编译.解释执行(C中是链接执行)等功能. 一.软件框架 ?软件框架是面向领域(如ERP.计算领域等)的.可复用的"半成品"软件

CDIF:基于JSON的SOA软件框架

通用设备互联框架(CDIF)是一个基于web的连接框架,目前有部分开源实现存放在: GitHub - out4b/cdif: Common device interconnect framework.CDIF是一种基于JSON的SOA软件框架.CDIF为客户端app提供了与基于XML的WSDL语言和SOAP协议同等抽象能力.但简洁得多的基于JSON的实现,也非常适合用于描述微服务架构的API接口.CDIF提供了完整的服务注册和发现能力,并为所有的web服务和物联网设备,包括REST.SOAP类型

DM8168 DVRRDK软件框架研究

转载注明:http://blog.csdn.net/guo8113/article/details/41120491 Netra(DM8168)处理器是个多核处理器,每个核之间相互独立却又相互关联,如何高效简洁地利用每个核完成一套系统功能是非常关键的,RDK这套软件平台就是针对这种多核平台设计的一套多通道视频应用方案,主要用于DVR.NVR.IPNC之类的产品. 这个软件框架结构允许用户创建不同的多路数据流来实现视频的采集.视频处理(DEI.Noise Filter.Encode.Decode.

软件架构(体系结构,Architecture)和软件框架

软件架构(architecture)是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计. 软件体系结构是构建计算机软件实践的基础.与建筑师设定建筑项目的设计原则和目标,作为绘图员画图的基础一样,一个软件架构师或者系统架构师陈述软件架构以作为满足不同客户需求的实际系统设计方案的基础.从和目的.主题.材料和结构的联系上来说,软件架构可以和建筑物的架构相比拟.一个软件架构师需要有广泛的软件理论知识和相应的经验来实施和管理软件产品的高级设计.软件架构师定义和设计软件的模块化,模块之间

服务框架和软件框架

一.服务框架 服务框架基于业务对应用SaaS分发模式的服务进行整合,以产生新的应用,其具有如下的特点: ü 它是面向特定领域的可复用软件集成平台: ü 反映了该领域应用的一般需求和结构: ü 具有部分实现的特性,包括一组与业务功能的整合密切相关.相互协作的组件: ü 服务框架中,与业务相关,但与业务功能的整合无关的组件以外部服务形式引入. ü 基于服务框架开发应用是通过扩展和复用外部服务实现的. 分布式服务框架是面向服务架构的基石,是解耦子系统的利刃.核心实现是RPC(远程过程调用),但又不仅限