随笔分类 - 其它 / 系统架构
摘要:回到目录使用了4年的IRepository数据仓储接口,今天要改变了,对于这个数据仓储操作接口,它提倡的是简洁,单纯,就是对数据上下文的操作,而直正的数据上下文本身我们却把它忽略了,在我的IRepository接口里根本没有数据上下文对象,这是不完整的,也许你会说,我使用了基类,数据基类里有数据上下...
阅读全文
摘要:回到目录对于数据仓储大家应该都很熟悉了,它一般由几个仓储规范和实现它的具体类组成,而仓储的接口与架构本身无关,对于仓储的实现,你可以选择linq2Sql,EF,Nosql,及XML等等,之前我介绍过linq2Sql,ef和nosql(redis)的仓储实现,今天主要说一下xml仓储的实现。下面的相关...
阅读全文
摘要:回到占占推荐博客索引概念相关thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。thrift允许你定义一个简单的定义文件中的数据类型和服务接口,以作为输入文件,编译器生成代码用来方便地生成RP
阅读全文
摘要:HI,很久没有写博客了,因为最近在做一个大项目,之所以说它大,是因为它是我一个人干的,做的挺吃力的,呵呵,做的过程中,我感觉,我确实是一个干事主义者,呵呵。项目结果图新技术用到了一个新的技术thrift,它是一种跨语言的架构,它是做服务器与服务器之间数据通讯用的,为我们生成中间代码,使用的通讯协议是tcp。热技术项目采用了动态组件自由注册的功能(IOC & AOP),使用unity家族实现的合理分层,方便展示项目采用根据业务分层的原则,并没有明显的DAL,Model,BLL,UI,而是由持久化层,实体层,核心业务层和动态UI展示层组成,UI层可以直接与持久化层通讯,这是与标准分层不同的
阅读全文
摘要:下面是按着我所接触的架构模式,开始一个一个的说一下 第一 标准架构 三层结构 、 第二 MVC架构 在表现层实现的一种设计模式,在这里C(控制器)是核心,它将M(模型)序列化和反序列化给View进行输出和输入(Response and Request) 第三 DDD领域驱动设计模式 它与传统的分层架
阅读全文
摘要:回到目录图在前目前项目中可能出现的三种Model模式,对于我们现在开发的一个项目,我觉得使用DDD的思想来设计模型比较清晰,使用DDD的思想把模型model分成了如下三种:下面是我微博中的截图:上面的图中把模型分成了ViewModel,它与页面相关,DomainModel,它与业务模块相关,Model,它与数据库相关,它是对数据表的一种映射,一般用XML来表示。文字说明在后下面我们来举个例子,用认识一下这三个模型:下面以用户业务为例,来讲一个这三种模型UserDomainModelpublic class UserDomainModel { [Required] ...
阅读全文
摘要:回到占占推荐博客索引DDD之前没有接触过,但一但有了接触就一发不可收拾,他会带去进入一个全新的世界!DDD不是新技术,而是新思想,新模式,是软件开发领域的一次突破,它更接近于业务,对于业务的改动它更加运用自如,它DDD模式里,你可能会涉及到IoC,AOP,OOP,OOD等设计模块,也可能会涉及到mv...
阅读全文
摘要:回到目录 说在前 Ioc组件有很多,之前也介绍过autofac,castle等,今天再来说一下在微软Nlayer DDD架构里使用的unity组件,今天主要说一下依靠注入,如果希望看拦截的用法,可以阅读这篇文章第十三回 实现AOP的拦截组件Unity.Interception 做在后 unity的用
阅读全文
摘要:回到目录看似不伦不类这个题目有点不伦不类,或者说有点伪模式了,不错,确实是这样,我们正确的开发思维是WEB层->BLL层->DATA层,每个层有对它下层的引用,下层不能引用上层,因为这会出现相互引用的错误,在实际工作中,BLL层会有涉及到各个业务的代码组织,实现数据持久化一般在Data层完成,这是可以理解的,也是我们经常使用的开发模式,这当然不是今天的重点,今天主要说一个实际问题,如订单处理的场合.一般订单处理流程如下:1 用户选择商品到购物车2 用户确定购买,生成订单3 选择一种或者几种支付方式4 支付完成,回写订单,修改订单状态5 支付交易成功,或者失败OK,这种订单业务事实上
阅读全文
摘要:aop_cache项目的架构aop_cache项目的架构,主要实现前台项目与后台项目共用缓存,缓存使用 Microsoft.Practices.EnterpriseLibrary.Caching,采用方法特性的注入,将需要缓存的方法进行拦截,AOP 功能使用Microsoft.Practices.Unity.Interception进行实现,缓存的中间件采用WCF实现,所以需要缓存的地方都通 过WCF去与Infrastructure.Core进行交互来取数据,WEB层只与WCF通信,如果不需要缓存的地方,WEB层可以直接访问 Infrastructure.Core层。Domain.Core:与
阅读全文
摘要:回到占占推荐博客索引 百度百科 redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hashs(哈希类型)。这些数据类型都 支持push
阅读全文
摘要:回到目录之所以把发消息拿出来,完全是因为微软的orchard项目,在这个项目里,将公用的与领域无关的功能模块进行抽象,形成了一个个的组件,这些组件通过引用和注入的方式进行工作,感觉对于应用程序的扩展性上有很大的提高,消息组件的提出是因为它的不固定性,从小方面说,项目模块的发消息的方式可能是不同的,有过模块是email,有的是数据库,有的是短信;而从大的方面说,对于项目与项目来说,它们发消息的方式也可能不同,所以,把它抽象出来,就显得很必要了。对于一个消息来说,它的行为很固定,即发消息,Send,而考虑到网络阻塞问题,我们也同样提供了异常消息的发送,接口规范如下: /// /// Me...
阅读全文
摘要:回到目录事情是这样的,前台网站有些数据不希望每次都从数据库里读,所以,应该做个缓存,而引起缓存更新的入口来自网站的后台管理,而前台和后台被部署在不同的网站中,这时缓存的更新就成了问题,前台的缓存与后台的操作不能联系到一起,为了解决这个问题,我引入了WCF作为中间件,所以与数据库的操作,读,写都来自一个入口,那就是WCF,WCF用户告诉你是否从缓存取数据,所有缓存的数据也缓存在WCF中,OK,想法不错,下面来说一下具体的实现步骤。一 首先看一下结构图:注意看我的结构图,前台aop_cache和后台aop_cache_background项目都引用aop_cache_webservice项目,而它
阅读全文
摘要:回到目录看了传说中的弦哥对园子里.Net项目分层与文件夹结构大全(最佳架子奖,吐槽奖,阴沟翻船奖揭晓),我也来说说我的DDD架构吧,主要是看了微软NlayerApp之后,自己写的一个,以后将会应用到我的项目之中。架构说明:0-Modeling and Design:架构的UML层次图,我认为每个项目的架构都应该先有UML图,再是进行具体的代码设计1-Presentation:UI层,它的实现是多种的,你可以是B/s的webpage,web mvc,web api,也可以是C/s的winform,wpf等等2-Application:这一层是网络应用层,它可以进行邮件,短信等功能的实现3-Ser
阅读全文
摘要:回到目录在编程世界里,使用“否定式”不是一件好事,因为它的可读性并不高,但有时,为了让使用者减少代码量,还是使用了双重否定,直到DefaultValue的出现,它改变了这一切,它可以为你的属性设置你想要的默认值,如bool类型默认值是false,而如果你希望它的默认值是true,就需要用到DefaultValue这个特性了。这是我IUnitOfWork代码片断 /// /// 工作单元 /// 提供一个保存方法,它可以对调用层公开,为了减少连库次数 /// public interface IUnitOfWork { /// ...
阅读全文
摘要:回到目录对于大数据量提交,包括插入,更新和删除,我始终不建议用EF自带的方法,因为它会增加与数据库的交互次数,一般地,EF的一个上下文在提交时会打开一个数据连接,然后把转换成的SQL语句一条一条的发到数据库端,然后去提交,试想,如果你的数据量达到万级别(更不用说百万,千万数据了),那对数据库的压力是很大的,所以,我将EF批量操作语句进行了改版,并起名为BulkInsert,BulkUpdate和BulkDelete,事实上,在我之前的版本中并没有涉及到批次提交的概念,直到遇到了实际的问题,当你使用BulkInsert时,如果数据达到4万之前,那在SQL的解释时,也是很有压力的,有多情况下会超时
阅读全文
摘要:品味编程,不是一味的根据书本上的知识讲,而是在实践开发过程中总结出来的,比较有感悟的东西,对于一个问题,可能有多种方法,但无论你使用哪种方式,请记住,一定要用代码的扩展性,可读性及健壮性上考虑,你写的代码是否合理,这需要你自己用心去体会,用心去设计,在代码设计上,请千万不要模棱两可!就像下面的例子,都是设计一个Font类,可两种结果却完全不同例子1:class Font { /// /// 大小 /// public int Size { get; set; } /// ...
阅读全文
摘要:前言我们进行linq to sql和ef时代后,底层的实现基本使用的是repository模块,即仓储模式,事实上就是把ORM实体的最基本操作进行封闭,对外层不公开操作实现的细节。面向接口的编程一个规定,多个实现,这可能是接口给我们带来的最直观的印象了,比如一个仓储在定义后,你可以用linq to sql实现它,也可以用ef去实现它,再或者使用ado.net去实现它,但它对外暴露的永远是稳定的接口,这里我们称为IRepository。仓储接口是否应该设计成基础操作接口和扩展操作接口这是今天说的重点,我们把仓储的最基本操作提炼出来,放到IRepository接口里,它叫做基本操作接口;将集合操作
阅读全文
摘要:回到目录对于linq to sql提供的CURD操作,给我们的感觉就是简单,容易使用,更加面向对象,不用拼SQL语句了,这些好处都表示在处理单条实体或者集合长度小的情况下,如果有一个1000条的集合实体,希望进行update操作,如果你还用linq to sql提代的update,那你服务器就快要挂了,呵呵。为什么呢?对于LINQ提借的命令,如update(list),它会把list进行foreache的遍历,然后一条一条指令的向SQLSERVER发送,好家伙,这要是1000,1W条实体的集合,进行update操作,这个对IO的开销和服务器的性能来说都是没法接受的,呵呵,应该是一个SQL链接,
阅读全文
摘要:回到目录在上一篇文章中提到了并发冲突,还说详细的说明在这讲来说,呵呵,那现在就说一下吧!并发冲突产生的原因事实上,linq to sql中的并发冲突是指记录在进行update操作时,客户端A1取出的数据{1,zzl,male},客户端A2也取出这条数据{1,zzl,male},这时A1进行对实体重新赋值{1,zzl,female},并进行submit提交,数据库的值被改为{1,zzl,female}注意:这时数据库的值{1,zzl,female}与A2所取出的值{1,zzl,male}已经不相同了,这时,在进行update时就会出现并发冲突。并发冲突的应对在进行submitchange时,由于
阅读全文