随笔分类 - 架构
摘要:A2D Framework增加了EF支持,加上原先支持ADO.NET:支持EF方式支持ADO.NET方式这次来讲如何让Entity Framework变成nb的读写分离1. 先设计EF模型, 可以图形方式设计,也可以数据库优先方式设计,总之设计完后,再转换成Code方式使用(用)2. 在DbContext类中,删除EF自动添加的报错代码,如下:protected override void OnModelCreating(DbModelBuilder modelBuilder){ throw new UnintentionalCodeFirstException();//...
阅读全文
摘要:A2D中一项功能是关于Cache的,能够将判断、获取、删除cache的代码缩减到最少量,如下是Order业务逻辑的demo示范:interface IOrder{ [Cachable("Order.GetMessage", "Default", ExpireType = CacheExpireType.Absolutely, Increment = 5)] string GetMessage(); [CacheEvict("Order.GetMessage", "Default")] void UpdateMess
阅读全文
摘要:最近在用CQRS架构模式做项目,有些感悟,记录下来。问题的描述(大家是否也存在过类似的情况呢?):从刚开始时项目中没有区分这3种对象,所以导致了很多职责公用,然后就乱了,比如Command一部分职责需要用到ASP.NET MVC中,所以定义在了底层dll中,并且贴了一堆一堆的DataAnnotation的tag到属性上,其中包括了很多remote验证、前端js validation组件的验证tag,很宏伟。后端CommandHandler那边传入DomainService的dll中,由于对数据转换还存在误解,所以也用得一塌糊涂。我目前的理解:ASP.NET MVC的Model层不能少,这个是细
阅读全文
摘要:先描述一下本篇描述的适用场景(3台server, 各个模块分布在各个Server上,分布式模块互相依赖、交互的场景):多个OSIG引擎交互上,使用的是.net remoting实现的,原理:当请求某个接口时(也就是要获取某Service Instance时),OSGI通过remoting连接到提供这个服务的url上,如:tcp://localhost:8888/OSGI连接成功后,源OSGI发送OpenService命令,让目标OSGI注册TCP Channel根据接口type、dll路径、appdomain name,在某个AppDomain中执行解析接口,然后连接到目标OSGI新开的服务上
阅读全文
摘要:目前只做了基础的功能,比如:各个模块单独的AppDomain容器Activator激活导出的服务检查不过,虽说这样,但目前的这个版本已经能实现模块分离、互相依赖调用等功能了,对模块划分已经有很好的作用了。先来说下基本结构:目前这个框架对UI的模块化尚不支持,只支持单机下的模块加载(以后会改进)。特点:Runtime、Module1、Module2、Module3都是在各自的AppDomain下运行的,不会互相干扰由于采用了隔离AppDomain的方式加载Module,所以能实现轻松卸载AppDomain、某dll、dll版本切换之类的任务,对后续扩展提供了方便来看看模块的编写OrderModu
阅读全文
摘要:基本验证与业务验证,基本验证就是始终保持不变的验证规则,可以通过如下硬编码实现:public class Order { [Required] [Range(typeof(decimal), "1", "10000")] public decimal Price { get; set; } [Required] [StringLength(30)] public string Customer { get; set; } [Required(AllowEmptyStrings=true)] ...
阅读全文
摘要:先上一张本文所描述的适用场景图分布式场景,共3台server:前端ServerOrder App ServerWarehouse App Server功能:前端Server可以不停的发送Command到CommandBus,然后由CommandBus分配不同的Command到各自的app server去处理。前端Server可以只发送Command而不必等待Response前端Server可以同步等待Response返回MSMQ消息超过3.5M会自动转为网络共享方式传输消息对于同一Command的处理,可以通过增加App Server的方式来提高并发处理速度(比如:可以开2个app serve
阅读全文
摘要:Taobao有她自己的分布式session框架,.net阵营也不能落后了,在下做了个基于MongoDB的支持最多26台MongoDB的分布式Session框架。先看看配置文件: SessionDB mongodb://localhost mongodb://localhost mongodb://localhost mongodb://localhost mongodb://localhost mongodb://localhost mongodb://localhost mongodb://localhost mongodb://localhost mongodb://...
阅读全文
摘要:在这篇文章中,EventBus实现 - 发布订阅 - XML加载所适用的范围只是本机的事件传播,要是牵涉到多台服务器之间的事件传播就不行了,解决办法有用msmq解决的,Node.js解决的,也有用redis的发布订阅解决的,这次用C# socket来实现,能实现立刻推送事件到所有订阅了相关event的server上。这次的子系统适用的场景如下:主要分2个部分:各个server使用的Event Bus Broker以及Event Bus Server。Broker与Server之间的通信协议就3个:ME、Subscribe、Publish。分别代表:我的名字是、我要订阅的事件是、我触发事件。Ev
阅读全文
摘要:这次介绍的这个框架只适用于中小项目,并且各个读写数据库结构是一致的情况,还要并且是写入数据库只有1台情况。我们来看看这个子系统适用的场景:我们来看这个子系统的配置文件: Server=.;Database=d1;User Id=sa;Password=111111; //唯一的主数据库(写入DB) Server=.;Database=d2;User Id=sa;Password=111111; //这些是普通的对等的读数据库,只是做了些普通索引优化 Server=.;Database=d3;User Id=sa;Password=111111; //同...
阅读全文
摘要:大家对这段代码肯定很熟悉吧:public List SearchUsers(string userName) { string cacheKey=string.Format("SearchUsers_{0}", userName); List users = cache.Find(cacheKey) as List; if (users == null) { users = repository.GetUsersByUserName(userName); ...
阅读全文
摘要:放心,这次不是说设计模式中的代理模式,说的是C#的RealProxy的用法,主要用于:通过给class贴标签,让class做更多的工作,比如判断是否存在缓存,有则直接返回缓存object,没有则保存为缓存,等待下次请求是可以更快的获取数据(当然这只是其中一种常用用途,MVC的Action就是采用这种方式)下面是序列图:.Net Object Generation interceptor属于.NET自身行为,不需要额外写代码。Code Consumer指想调用RealObject来进行调用的对象,比如控制台程序,或者WEB程序。ProxyAttribute里定义了具体代理类是哪个,这个代理类是自
阅读全文
摘要:对象池服务可以减少从头创建每个对象的系统开销。在激活对象时,它从池中提取。在停用对象时,它放回池中,等待下一个请求。我们来看下主线程中,如何与对象池打交道:static void Main(string[] args) { InstancePoolResolver.Register(); while (true) { Thread.Sleep(2000); Console.Clear(); for (int i = 0; i ...
阅读全文
摘要:所谓半同步半异步是指,在某个方法调用中,有些代码行是同步执行方式,有些代码行是异步执行方式,下面我们来举个例子,还是以经典的PlaceOrder来说,哈哈。PlaceOrder的主要逻辑:public bool PlaceOrder(OrderInfo order){ //验证Order合法性 //OrderInfo增加到仓储 //生成order的pdf //通知客户,email方式}我们假设做出如下决定:public bool PlaceOrder(OrderInfo order)...
阅读全文
摘要:受到CQRS的影响,写了个EventBus,能实现发布订阅模式执行event,在DDD模型中,可以使用如下代码触发事件:EventBus bus = EventBus.Instance();bus.Publish(new OrderAddedEvent());解决方案结构图如下,很简单易懂:xml事件配置代码sample如下(1个event可以定义多个订阅者,如下): ConsoleApplication2.code.Events.OrderAddedEvent ConsoleApplication2.code.EventHandlers.OrderAddedEve...
阅读全文
摘要:我们先来看看本人对下面这两个名词的个人见解:软件架构:几乎每个软件系统的架构都是不同的,因为软件架构的第一步就是根据当前项目的重要需求及约束来制定一个个技术决策。软件框架:可以分成行业框架和通用框架。通用框架是对大多数软件项目常用的模块(底层+高层)进行封装(同时暴露热点)的一个集合,能提高开发速度以及质量行业框架是针对某特定领域,把类似领域逻辑提取出来进行封装(同时暴露热点)的一个集合,能提高开发速度以及质量行业框架可以是基于通用框架之上的。站在架构师的角度,针对架构的开发,会慢慢演变为针对框架的开发(由于需要考虑复用以及对开发人员友好API特性)伸缩性:一般是指机器级别的横向扩展,如:we
阅读全文
摘要:是一缓存,能够Set, Get value,哈哈,普通用法如下:public User GetUser(int userId){ UserInfo user = cacheService.Get("UserInfo:" + userId) as UserInfo;//cacheService是自定义的接口,具体的memcache实现代码被隔离了 if (user == null) { user = dao.GetUser(userId); cacheService.Se...
阅读全文
摘要:设计模式:简单工厂模式工厂方法模式抽象工厂方法模式单例模式外观模式生成器模式原形模式中介者模式代理模式观察者模式命令模式迭代器模式组合模式模版方法模式策略模式状态模式备忘录模式享元模式解释器模式装饰器模式职责链模式桥接模式访问者模式企业应用架构模式事务脚本大家都懂的写法领域模型DDD的建模方法:领域对象、value对象Unit of WorkEntity Framework已经集成这功能了Lazy Load同上查询对象针对Specification类的自定义资源库RepositoryDTO和Message和WCF有关系,对大数据的soap需要自定义压缩、还原,否则占带宽并发锁Entity Fr
阅读全文
摘要:架构要分阶段,而后分视图:把握需求特点,确定架构驱动力(预备架构)采用 二维需求观 来定出需求特定和非功能性需求优先级、取舍根据重大需求,确定概念架构(概念架构)细化架构设计,关注不同视图(4+1视图)逻辑视图开发视图运行视图数据视图物理视图*贯穿如上3过程的有*对非功能目标的考虑关注约束,要乘早。架构设计,除了关注架构本身外,还关注到人,比如,划分子系统原则中,有如下:职责分离原则通用专用分离原则技能分离原则(关注到了人)工作量均衡原则(关注到了人)************预备架构***********预备架构关注质量因素和相互冲突关系,需要谨慎做出权衡。质量点:持续可用性性能可扩展性安全性
阅读全文