首页 文章 精选 留言 我的

精选列表

搜索[dotnet],共602篇文章
优秀的个人博客,低调大师

DotNET4.0 新增内容总结(二)

5. C#4.0 语言新特性 之 .NET 动态编程(.NET Dynamic Programming) C# 语言的发展 动态编程架构 其实就是添加了一个关键字 Dynamic.Dynamic 和 object , var 的区别: object 是Sytem.Oject的简写,根类型。 var , 不能单独使用比如var x; 在语法上是不允许的,必须初始化,如var x=E. 然后x就是typeof(E) 类型了。 Dynamic, 动态动就在运行之前,类型是可变的,与Javascript 做一个联想。 运行例子之前,记得导入 Microsoft.CSharp.dll classProgram{ staticvoidMain(string[] args) { dynamicd = GetADynamicThing(); Console.WriteLine(d.Divide()); //类型在运行时才真正确定 } privatestaticdynamicGetADynamicThing() { returnnewSimpleCalculate(10,5); } } publicclassSimpleCalculate{ privateintnum1; privateintnum2; publicSimpleCalculate(intnumberone,intnumbertwo) { num1 = numberone; num2 = numbertwo; } publicintDivide() { if(num2 > 0) returnnum1 / num2; returnnum1; } } 更多关于dynamic的信息请参考: http://msdn.microsoft.com/en-us/library/dd264736(VS.100).aspx http://blogs.msdn.com/cburrows/archive/2008/10/27/c-dynamic.aspx http://blogs.msdn.com/samng/archive/2008/10/29/dynamic-in-c.aspx 6. ASP.NET MVC ASP.NET WebForms 和ASP.NET MVC 的关系 两者不冲突,在开发中多人合作开发用MVC,一个人开发用ASP.NET WebForms. 在MVC 开发中某些页面也可以使用ASP.NET WebForms. 到下面的地址下载ASP.NET MVC For Visual Studio 2010 Beta 1 http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28527 然后开始Learn MVC http://www.asp.net/mvc/learn/ 本文转自 xhinkerx 51CTO博客,原文链接:http://blog.51cto.com/xhinker/195433,如需转载请自行联系原作者

优秀的个人博客,低调大师

Dotnet3.0下SnowFlake算法生成53位ID

世界上没有两片雪花是完全相同的。 为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的ID,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统中不同机器产生的ID必须不同。Twitter公司提出了一种名为SnowFlake算法来生成唯一的ID作为系统中的key。 为何需要生成ID? 在应用程序中,经常需要全局唯一的ID作为数据库中表主键。如何生成全局唯一ID? 首先,需要确定全局唯一ID是整型还是字符串?如果是字符串,那么现有的UUID就完全满足需求,不需要额外的工作。缺点是字符串作为ID占用空间大,索引效率比整型低。 通常情况下,我们都会使用数据库的自增主键功能,从1开始,基本可以做到连续递增。Oracle可以用SEQUENCE,MySQL可以用表主键的AUTO_INCREMENT, 虽然不能保证全局唯一,但每个表唯一,也基本满足需求。 但是这样的做法有两个问题,第一个是每次生成都是先要插入数据库,让数据库去生成这个ID后返回。当需要插入关联数据的时候,必须先等数据库插入成功,然后才能插入关联数据。如果插入过程比较长,需要用队列操作的时候,就无法将相关操作放入队列做异步处理。第二个是生成的ID是连续的,很多ID是用于用户号,订单号等敏感信息,网站外部用户可以根据特定时间之间生成的ID差值来估算出业务量。 因此,可以在插入数据库之前,就先用Twitter提出的雪花算法,生成ID后再作为主键插入数据库。 SnowFlake算法 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 1位,不用。二进制中最高位为1的都是负数,但是我们生成的id一般都使用整数,所以这个最高位固定是0 41位,用来记录时间戳(毫秒)。 41位可以表示2^{41}-1个数字, 如果只用来表示正整数(计算机中正数包含0),可以表示的数值范围是:0 至 2^{41}-1,减1是因为可表示的数值范围是从0开始算的,而不是1。 也就是说41位可以表示2^{41}-1个毫秒的值,转化成单位年则是(2^{41}-1) / (1000 60 60 24 365) = 69年 10位,用来记录工作机器id。 可以部署在2^{10} = 1024个节点,包括5位datacenterId和5位workerId 5位(bit)可以表示的最大正整数是2^{5}-1 = 31,即可以用0、1、2、3、....31这32个数字,来表示不同的datecenterId或workerId。严格来说,应该每个进程都需要不同的workId。 12位,序列号,用来记录同毫秒内产生的不同id。 12位(bit)可以表示的最大正整数是2^{12}-1 = 4095,即可以用0、1、2、3、....4094这4095个数字,来表示同一机器同一时间截(毫秒)内产生的4095个ID序号。 SnowFlake算法生成53位长度整数 如果直接用网上的SnowFlake算法库生成的64位长度整数,在作为主键传递到Web前端的时候,就会碰到一个大坑。JavaScript里面没有64位整数,只有一种Number数据类型表示数字,采用IEEE754格式来表示数字,不区分整数和浮点数,JavaScript中的所有数字都用浮点数值表示,最大的数字精度只有53位,超过这个位数,JavaScript将丢失精度。因此,使用53位整数可以直接由JavaScript读取,而超过53位时,就必须转换成字符串才能保证JavaScript处理正确,这会给API接口带来额外的复杂度。 因此我根据网上的代码,做了一些修改,用c#语言改写SnowFlake算法生成53位长度整数。方法就是保留41位时间戳,加上2位机器编号,10位序列号组成一个53位的ID。对于小型的项目,4个生成器也够用了,每毫秒最多可以生成1024个序列号也足够满足使用。 源代码以MIT协议的方式开源,托管到github。

优秀的个人博客,低调大师

DotNET企业架构应用实践-基于接口开发介绍以及应用场景和案例

基于接口开发介绍 基于接口编程的本质是分离对象的实现与使用者之间的关系,即变更以下对象结构的依赖变化: 这样说的好处是客户对象依赖于服务接口,即在开发过程中我们只关注于服务接口的定义,而不关注于服务对象的具体实现,客户对象只有在运行期才通过解耦与后期绑定辅助工具(类)与具体的服务实现对象动态的建议依赖。 这样做的好处是很显然的,从技术上讲,如果把服务接口与服务实现分别放在不同的组件之中,那么修改了服务实现组件,我们不用重新编译客户组件,在软件工程上的带给我们的好处是,服务接口与服务组件即接口定义与实现可以相分离,可以交给不同的人去做,同时,我们可以通过这种结构实现在运行期通过动态配置以替换不同的服务组件实现。 一个应用场景及案例 比如我们要开发一套HIS系统,需要集成医疗保险,但是不同的地区使用不同的医疗保险系统,我们的HIS必须要达到在与不配的医疗保险系统相配合,但我们不能因为应用了不同的医疗服务而变更HIS中的相关逻辑,那么我们应该怎么办呢? 答案是采用基于接口驱动的思想,我们定义一个HIS医疗保险接口组件(HIS.Medicare.Interface),HIS系统中使用医疗保险业务的地方切调用这个接口的方法或者服务,而我们在不同的城市实施HIS的过程中,开发出各城市的医疗保险实现组件,比如HIS.Medicare.Lanzhou、HIS.Medicare.BaoTou,我们也可以弄一个空的实现HIS.Medicare.Default,即不使用医疗保险的情况,那么整个结构就如下所示: HIS系统中的HIS.Medicare.Interface消费者对一切保险业务的处理都是调用HIS.Medicare.Interface包中的业务定义组件,不关心系统运行时倒低采用那一个实现,或者没有实现或者只有一个默认的实现HIS.Mecicare.Default,或许真实运行环境的这具体实现还没有开发,实能在项目中需要才去开发,那么消费者与接口的实现是如何建立联系的呢? 实现的后期绑定 消费者与具体的实现如何建设关系呢,方法有很多种,最常见的莫过于使用抽像工厂模式,也可以使用IOC容器进行解耦,具体如何说呢,我下面示例说明。 比如我们在HIS.Medicare.Interface定义了一个接口IMedicareProvider 1 public interface IMedicareProvider 2 { 3 IMedicareDrugSelectCreateMedicareDrugSelect(); 4 5 IMedicareItemInfoSelectCreateMedicareItemInfoSelect(); 6 7 IMedicareServiceSelectCreateMedicareServiceSelect(); 8 } 而我们在HIS.Medicare.Lanzhou、HIS.Medicare.BaoTou和HIS.Medicare.Default中都实现了这个类,那么我们刚可以在HIS.Medicare.Interface组件中增加如下代码: 1 public static class MedicareProviderHelper 2 { 3 static readonly string ConfigKey = " HIS.MedicareProvider " ; 4 public static IMedicareProviderMedicareProvider 5 { 6 get 7 { 8 return ContextHelper.GetContext().Container.GetComponentInstance(ConfigKey) as IMedicareProvider; 9 } 10 } 11 } 并且需要在系统配置文件的IOC配置信息中增加如下内容: 1 < object name ="HIS.MedicareProvider" assembly ="HIS.Medicare.Default" type ="HIS.Medicare.Default.MedicareProvider" LifestyleType ="Thread" /> 上面我处理我使用了AgileEAS.NET平台中的IOC组件,有关IOC的介绍请参考AgileEAS.NET平台之对象控制反转一文。这样处理以后,我们在任何使用IMedicareProvider 接口的地方直接采用MedicareProviderHelper.IMedicareProvider 的方式消费IMedicareProvider 对象。 结束语 事实说明,基于接口开发在某些应用场景能很好的分离服务对象与消费者对象之间的依赖,在软件开发过程中不失为一种非常有效的手段,如果运用的合理,将起到事半功陪的效果,但是,基于接口开发也不是万能的,并不解决问题的唯一银弹,就比如我们传统的文件,架构或者模式的设计一切基于应用为先的原则,即怎么样的业务即采用怎么样的架构技术,不如一味的强求与照搬。合理就好。 文未我加点广告,谢谢! 链接 一步一步教你使用AgileEAS.NET基础类库进行应用开发-系列目录 AgileEAS.NET平台开发指南-系列目录 AgileEAS.NET应用开发平台介绍-文章索引 AgileEAS.NET平台应用开发教程-案例计划 AgileEAS.NET官方网站 敏捷软件工程实验室 QQ群:116773358(AgileEAS.NET平台),9105332(系统架构交流群) 作者:魏琼东出处:http://www.cnblogs.com/eastjade关于作者:有13年的软件从业经历,专注于中小软件企业软件开发过程研究,通过在技术与管理帮助中小软件企业实现技术层面开源节流的目的。熟悉需求分析、企业架构、项目管理。现主要从事基于AgileEAS.NET平台的技术咨询工作,主要服务于医疗卫生、铁路、电信、物流、物联网、制造、零售等行业。如有问题或建议,请多多赐教!本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过mail.james@qq.com联系我,也可以加入QQ群:113723486、199463175、116773358、116773358、212867943、147168308、59827496、193486983、15118502和大家共同讨论,非常感谢。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册