随笔分类 - 积累
摘要:背景有些刚接触CQRS的朋友容易被Event Sourcing带到沟里去,其实CQRS和Event Sourcing没有直接的关系,本篇文章我就介绍一种不用Event Sourcing的CQRS。最简单的CQRS架构架构图关键思路一、Comamnd和Query采用完全不同的组织思路。二、Command执行后如果希望返回数据给UI,同步的使用Query进行查询。三、Command和Query采用一个数据库。代码示例下载地址:http://yunpan.cn/Q5bkD3wmVXBpv(访问密码:9c16)。运行效果主要代码TestDynamicQueryController.cs 1 using
阅读全文
摘要:背景小明和小强同时签出了源代码,如果小强先提交,那么提交成功是合理的,接着小明提交了修改,这时源代码服务器就会告诉小明有人在他读取之后做了修改,问他如何处理,源代码服务器会让小明把修改合并后再提交。这就是乐观锁策略,当然源代码服务也可以配置为悲观锁以避免并行修改。合理的规避并发修改是企业应用中不能回避的问题,但现实场景是,很多团队都回避这个问题。今天我介绍一下如何使用离线乐观锁处理并发修改。相关文章:再谈在线悲观锁、离线悲观锁、在线乐观锁和离线乐观锁。思路CAS:Compare And Swap,只有当要修改的值在我读取后没有被修改,才会被交换(修改)。CAS是多线程领域的术语,比如:无锁的环
阅读全文
摘要:背景系统会出现并发,上篇文章我介绍了如何使用“离线乐观锁”保证并发,离线乐观锁适合处理那些重新编辑成本不大的单据,如果某个单据用户花了10分钟进行编辑,提交时你告诉他出现并发了,他心里肯定会骂娘的,今天介绍的“离线悲观锁”就可以避免这种情况。思路小明签出了源代码,小强就不能签出了,我们目前的源代码系统就是用的这种悲观策略。实现核心代码离线悲观锁管理器接口 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Ta
阅读全文
摘要:一、Delegate委托可以理解为一个方法签名。 可以将方法作为另外一个方法的参数带入其中进行运算。在C#中我们有三种方式去创建委托,分别如下:public delegate void Print(string str); static void delegatemethod(string str) { Console.WriteLine(str); } public static void Main() { #region 委托 //1.普通委托 ...
阅读全文
摘要:ProblemDescription 威威猫不是一只普通的猫,普通的猫喜欢吃鱼,但威威猫最喜欢吃鸡腿。他每天都在不停的吃啊吃,吃了一只又一只鸡腿。现在他遇到了一个难题,如果他的体重太胖那么他的主人就不给他吃鸡腿了,所以他需要你的帮助。 威威猫的身体由n个器官构成,由于他的身体很特殊所以他的增长也很特殊(不要问为什么,喜欢吃鸡腿的猫已经够奇怪了)。他的增长有个k1和k2系数,而且每天的增长量和前一天有关,我们假设这n个器官在第i天的数值分别是a(i,1),a(i,2),a(i,3)……a(i,n),那么,第i+1天他每个器官的数值就会变成: a(i+1,1)=k1*a(i,1)+k2*a(...
阅读全文
摘要:语句:values current date;values current timestamp;
阅读全文
摘要:INT最大值是21亿,每天100万个事务,也够用58年。而且,你不可能存这么多条数据,而且是不断删除的。如果你还担心,可以用序列Sequence,BIGINT的,可以用到宇宙爆炸。下面的语句创建了自增长字段的表,自增长字段采用了BIGINT,足够大:create table TEST_ID (ID_COL BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY );
阅读全文
摘要:public GetQuotationbyIdJson GetQuotationbyId(string quotationid) { GetQuotationbyIdJson json = null; StringBuilder sqlstr = new StringBuilder(); ArrayList list=new ArrayList(); sqlstr.Append("select qp.SellerId,qp.QuotationId,qp.BookNo,q...
阅读全文
摘要:/ //****************2013-04-12********************// //这种方法在服务器端保存图片存在权限问题,已废弃//// /// <summary> // /// 字节流转换成图片 // /// </summary> // /// <param name="byt">要转换的字节流</param> // /// <returns>转换得到的Image对象</returns> // public System.Drawing.Image BytesToImg..
阅读全文
摘要:首先,File类是个静态类,无法实例化。它的命名空间是:using System.IO File中基本的方法如下演示:图一、File.Create图二、File.Copy一般情况图三、File.Copy(path,path1,true);图四、File.Delete图五、File.Exists();图六、File.Move图七、File.ReadAllLines()图八、ReadAllText和ReadAllLines的区别图九、一道简单的练习题图十、File.Replace图十一、File.WriteAllLines()图十二、File.WriteAllText( )图十三、File.Ap.
阅读全文
摘要:using System;using System.IO;using System.Drawing;using System.Windows.Forms;using System.Drawing.Imaging;public class ImageConvert{ //主要通过Stream作为中间桥梁 public static Image ByteArrayToImage(byte[] iamgebytes) { MemoryStream ms = new MemoryStream(iamgebytes); Image image = ...
阅读全文
摘要:C#中AppDomain.CurrentDomain.BaseDirectory与Application.StartupPath的区别// 获取程序的基目录。System.AppDomain.CurrentDomain.BaseDirectory// 获取模块的完整路径。System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName// 获取和设置当前目录(该进程从中启动的目录)的完全限定目录。System.Environment.CurrentDirectory// 获取应用程序的当前工作目录。System.IO.Dire
阅读全文
摘要:{0:yyyy-MM-dd HH:mm:ss.fff}:使用24小时制格式化日期{0:yyyy-MM-dd hh:mm:ss.fff}:使用12小时制格式化日期以下同理,从左至右分别为-年-月-日 时:分:秒.毫秒{0:yyyy-MM-dd HH:mm:ss zzz}{0:yyyy-MM-dd HH:mm:ss.ff zzz}{0:yyyy-MM-dd HH:mm:ss.fff zzz}{0:yyyy-MM-dd HH:mm:ss.ffff zzz}以下测试代码//---假设时间为-2009-03-17 16:50:49.92object objValue2 = Business.Servic
阅读全文
摘要:Null是.net中无效的对象引用。DBNull是一个类。DBNull.Value是它唯一的实例。它指数据库中数据为空(<NULL>)时,在.net中的值。以下是我测试的一个例子。例:表tbl_Studentidnameaddress1jim<NULL>将上述表数据填充到.net的名为dt的DataTable中。dt.Rows[0]["address"]不等于null但是等于DBNull.Value.可见null表示一个对象的指向无效,即该对象为空对象。DBNull.Value表示一个对象在数据库中的值为空,或者说未初始化,DBNull.Value对
阅读全文
摘要:如今网络在我们的生活工作中所起的作用越来越大,可以说离开了网络我们就无法正常的工作和生活。作为程序员我们写的程序大多数也会跟网络相关,而想要使用网络首先要将机器的网络配置设置好。而手动设置的方法显然很不可取,所以我们要让程序帮我们完成。下面是一个很常用的C#设置系统各种网络参数的一个小Demo一起看看吧。这个Demo是通过"Win32_NetworkAdapterConfiguration"这个管理类.这里面已基本包括了IP,DNS,网关的设置信息。在C#中使用WMI还是比较简单的:using System;using System.Collections.Generic;
阅读全文
摘要:逆变(contravariant)与协变(covariant)是C#4新增的概念,许多书籍和博客都有讲解,我觉得都没有把它们讲清楚,搞明白了它们,可以更准确地去定义泛型委托和接口,这里我尝试画图详细解析逆变与协变。变的概念我们都知道.Net里或者说在OO的世界里,可以安全地把子类的引用赋给父类引用,例如:?123//父类 = 子类stringstr = "string";objectobj = str;//变了而C#里又有泛型的概念,泛型是对类型系统的进一步抽象,比上面简单的类型高级,把上面的变化体现在泛型的参数上就是我们所说的逆变与协变的概念。通过在泛型参数上使用in或o
阅读全文
摘要:接口是一种按照契约设计的方式,一个类型必须实行接口中定义的方法。抽象基类则为一组相关的类型提供了一个共有的抽象。要注意二者的使用场景和区别:基类描述了对象是什么;接口描述了对象将如何表现行为。1.关于接口 接口描述了一组功能,是一个契约,任何实现接口的类型必须为接口中定义的所有所有元素提供具体的实现。我们应该将可重用的行为提取出来,定义在接口中;由于不同相关的类型均可以实现一个接口,所有这会增加代码的重用率。对于开发者本身来说,实现接口要比继承自定义的基类更容易。 2.关于抽象基类 抽象基类除了描述共同行为,抽象基类还可以为派生类提供一些具体的实现(为子类通过通用、可重用的代码)。抽...
阅读全文
摘要:using System.Net; public bool CheckUrlVisit(string url) { try { HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); if (resp.StatusCode == HttpStatusCode.OK) { ...
阅读全文
摘要:本文将介绍以下内容:using指令的多种用法using语句在Dispose模式中的应用1.引言在.NET大家庭中,有不少的关键字承担了多种角色,例如new关键字就身兼数职,除了能够创建对象,在继承体系中隐藏基类成员,还在泛型声明中约束可能用作类型参数的参数,在[第五回:深入浅出关键字---把new说透]我们对此都有详细的论述。本文,将把目光转移到另外一个身兼数职的明星关键字,这就是using关键字,在详细讨论using的多重身份的基础上来了解.NET在语言机制上的简便与深邃。那么,using的多重身份都体现在哪些方面呢,我们先一睹为快吧:·引入命名空间·创建别名·
阅读全文