摘要:
写在前面: 软件开发伴随我走过11年职业生涯,大大小小的系统开发过好多个,有成功的,有失败的,软件公司虽然是戴着高科技的帽子,却干着苦命的工作,整个过程对开发人员来讲,都是煎熬,但问题出在哪呢?如何解决呢? 针对以上问题及我在行业实践中的总结,结合公司的框架情况,将我们的工作成果及解决方案发表如下,供各位同学参考,也希望高手提出宝贵意见。 行文组织说明:先概括,后具体,先提问题,再思考问题的解决方案,最终实现之。目录一、 创业经历简介二、 什么是IBeamMDAA三、 IBeamMDAA的目标与解决的问题3.1 我们开发的软件是什么样的软件?3.2 用户的组织结构是什么,以及组织结构对软... 阅读全文
摘要:
框架一词是被使用最泛滥的词语,目前在光标科技内部即指IBeamMDAA,是为解决企业信息化应用而建立的应用工具集,包含应用服务器宿主、常用工具集、系统自举、任务调度、企业基础设施与应用入口工具集等部分,它解决了应用开发、部署、维护配置等软件工程方面的问题,但它并不是万能的,每位使用者都应有一个清晰的认识,我相信任何系统都有它的设计目标与能力范围,而对于使用者而言最重要的是框架能提供什么价值,在适当的环境中选择适当的工具解决适当的问题。 整个软件业都在追求自动化与智能化,并取得一定的成就,连软件开发都希望能自动化生成,但企业管理信息化的服务对象是企业的人,不同的企业、不同的人适用不同的管理制度. 阅读全文
摘要:
在多线程并发操作环境中,对数据库的操作也必须注意防止并发控制不适当导致数据混乱,目前已经遇到的情况有: 线程1在保存 类A 的数据,未使用 事务性会话,同时线程2在操作 类B 的数据,使用了 事务性会话,得到的结果是:线程1 的操作全部丢失,线程2 的操作结果正确保存到了数据库。调试错误时却发现,线程1 的程序在测试时由于是单线程环境,运行完全没有问题,开发人员感到莫名其妙,无从下手。 为了避免以上情况,应坚持按如下规则使用会话: A、纯查询使用无刷新会话,示例如下: private void DataPortal_Fetch(PartyListCriteria criteria)... 阅读全文
摘要:
IBeamMDAA使用Common.Logging作为日志输出组件,使用方法非常简单,代码如下: ILog log = LogManager.GetLogger(this.GetType()); log.Info("日志信息"); 关于如何配置Common.Logging请查看“IBeamMDAA应用服务器配置”章节。 只是在使用日志组件时,也要注意日志的级别,不必输出所有级别的日志,日志数据太多,反而很难找到有用的信息,同时日志输出IO操作非常影响性能。 阅读全文
摘要:
自动任务在实际运行中一般不需要人工管理,但有时需要更改任务的运行参数,或根据服务器的负载情况来调整哪些服务器运行哪些任务等,此时需要对服务器运行参数进行调整。 应用服务器的管理是通过客户端进行的,调整结束后,必须重新启动服务器才可应用最新配置。 查看指定应用服务器上的自动任务实例: 自动任务管理及参数调整: 参数调整示例: 比如 自动任务A 是专门负责处理某类任务的,数据量有100万条,每条数据的处理都消耗一定的时间,现有10台应用服务器可供使用,为了充分并均衡地发挥服务器的能力,我们配置第一台服务器处理0-10万条数据,第二台服务器处理10万-20万条数据,以此类... 阅读全文
摘要:
自动任务调度是应用服务器的基本功能之一,自动任务主要是为了解决一些与用户交互无关,但与时间、日期相关的一些周期性任务,此类任务的特点是数据量大、无需人工干预、有规律,遇到这样的任务都可以考虑使用自动任务。 所在组件:IBeamMDAACore 名称空间:IBeam.MDAA.Objects (业务对象) 用法举例: 在IBeamMDAA框架中开发自动任务比较简单,用户无需关心与任务无关的调度、配置等问题,只需遵守两个简单的原则即可: 1、任何自动任务都必须实现 IAutoTask 接口,IAutoTask 接口定义如下: public interface IAutoTas... 阅读全文
摘要:
每个公司或团队都有自己的开发习惯或开发模式,光标科技这些年来一直坚持CodeFirst,对于实体对象的分析设计,我们的流程是,先根据业务需求分析设计出实体对象及对象之间的关系,最终生产出UML类图,为了避免管理图纸与需求文档花去过多的时间,其它UML图在业务简单的情况下默认省略,只在业务复杂的时候配上流程图,帮助程序员写代码;代码规范与写法每位员工入职时必须先学习,框架结构与操作流程 也在真正进入开发前灌输到每一位开发人员,再辅以开发样例学习,这样避免了向每一位同事讲述系统构架、组件功能等等这样的工作,使每一位开发人员可以在极短的时间内投入到工作中,得到的结果与资深程序员没有什么区别,即使他并 阅读全文
摘要:
使用ORM映射工具对数据库进行操作,由于对象关系(数据库表关系)间的复杂关系,往往导制N+1次数据查询,即:本来是查询某一数据对象,却因为对象关系把与对象相关的所有数据都从数据库加载到内存,而这些数据并没有被使用到,然后又马上丢弃,有时甚至只是一个简单的查询,却将整个数据库读取到内存后又丢弃,如此反反复复,整个数据库服务器都在不停的运转,高磁盘IO,高CPU占用率,完全是无用功。 数据库缓存的作用是只在数据第一次被访问时才从数据库中读取数据,将数据放在存储介质中,以后查询相同的数据则直接从存储介质(内存)中返回,这样速度有明显的提升。基本原理是用空间换时间,理论性的知识这里不必一一列出,可.. 阅读全文
摘要:
IBeamMDAA没有限制必须使用什么样的数据库访问技术,IBeamMDAA即没有自己创造数据访问层组件,也没有使用.net最新数据访问层技术(比如:Linq或EntityFreamwork),而是保守地使用了经过大量实践检验的NHibernate,但我们推荐使用CastleActiveRecord,CastleActiveRecord的基础组件使用NHibernate,因此,IBeamMDAA目前支持比较完善的是CastleActiveRecord,在性能与可移植性取得平衡,关于NHibernate的性能探讨请在网络上搜索这方面的研究。 NHibernate本身是支持多数据库平台的,因此可. 阅读全文
摘要:
按照上图所示,取当事人的银行账号信息应该先取当事人对象,根据对象导航关系可以找到当事人银行账户信息列表,但在实际应用时,银行账户信息并不是经常被使用的信息,每次加载当事人(Party)时,都把银行账户信息一起加载,一方面占内存,也浪费传输带宽,因此没有在当事人(Party)类中定义当事人银行账户列表属性。可通过以下代码取得当事人银行账户列表: public static BankAccountList GetBankAccountListByParty(int partyID); 阅读全文
摘要:
取当事人的联系首先是要找到当事人(Party),当事人属性中定义了联系方式列表属性(ContactMechanisms): #region 用户拥有的联系方式 private static PropertyInfo<ContactMechanismList> ContactMechanismsProperty = RegisterProperty(typeof(Party), new PropertyInfo<ContactMechanismList>("ContactMechanisms", "联系方式")); /// < 阅读全文
摘要:
/// summary ///查询具用指定功能权限编号的当事人 /// /summary /// param name="functionID"功能权限编号/param /// param name="name"当事人名称/param /// param name="maxResult"查询返回最大结果数,0 为不限制/param /// returns当事人列... 阅读全文
摘要:
/// <summary> ///根据当事人挡任的角色名称、当事人名称、名称拼音、身份证号模糊查询当事人 /// </summary> /// <param name="RoleName">角色名称</param> /// <param name="Name">当事人名称</param> /// <param name="maxResult">查询返回最大结果数,0 为不限制</param> /// <returns>当事人列表 阅读全文
摘要:
业务处理时必须确定事件的当事人,系统中提共了多种方法选择当事人。 所在组件:IBeamMDAACommon.dll 名称空间:IBeam.MDAA.Objects (业务对象) 用法举例: 通过代码选择: /// <summary> /// 根据名称、名称拼音、身份证号模糊查询当事人 /// </summary> /// <param name="Name">当事人名称</param> /// <param name="maxResult">查询返回最大结果数,0 为不限制</param& 阅读全文
摘要:
在人与人交往或商业活动中,事件发生或交易的参与人都称为当事人,当事人可能是个人,也可能是组织或团体,每个当事人都扮演了一定的角色。 每个人在工作或生活中都有多种角色,比如: 张三 对于其父母来说,角色是 儿子,张三 对于其 姊妹来说是 哥哥,对于其所在单位 张三 是雇员。 在企业管理中角色也称为岗位,有时一个岗位就是一个人,有时一个岗位可能有多个人,也有可能某人身兼数职,也即他同时在多个岗位上任职或工作。 因此,企业管理中的岗位概念也即角色,角色管理就是岗位管理,岗位职责定义了在某个岗位工作的人,应具有的职业能力,负责的工作职责与范围,要开展工作就需要具有一定的资源支配权,岗位不同,... 阅读全文
摘要:
Winform 客户端程序自动显示运行主程序集的名称,在程序集信息中填写好即可,如下图所示: 关于产品信息: 阅读全文
摘要:
IBeamMDAAMembershipProvider的定义如下: public class IBeamMDAAMembershipProvider : MembershipProvider MembershipProvider的定义如下: // 摘要: //定义ASP.NET 为使用自定义成员资格提供程序提供成员资格服务而实现的协定 public abstract class MembershipProvider : ProviderBase 由此可以看出,IBeamMDAAMembershipProvider 是IBeamMDAA为创建Asp.net 自定义用户成员... 阅读全文
摘要:
系统刚刚建立时,完全是一个空的系统,IBeamMDAA系统自动创建一名系统管理员,并且管理员代表的当事人是顶级机构,系统管理员不可删除,且在查询系统操作员也不列出,用户名称为:admin,初始默认密码为:123456,管理员是特权用户,具有所有权限。 在“如何理解当事人与当事人角色?”章节中我们讨论了什么是角色,系统操作员也是一种角色,每种角色都对应到企业管理的岗位,每个岗位都有特定的岗位职责及履行职责所需的权限。系统中的操作员由机构中真实的当事人担任,权限管理是以岗位为管理单元的,某个当事人在什么岗位任职,即具备了该岗位的权限。 岗位管理如下图所示: 系统用户(操作员)... 阅读全文
摘要:
系统刚刚建立时,完全是一个空的系统,IBeamMDAA系统自动创建一名系统管理员,并且管理员代表的当事人是顶级机构,系统管理员不可删除,且在查询系统操作员时也不列出,用户名称为:admin,初始默认密码为:123456,管理员是特权用户,具有所有权限。 在讨论组织机构的权限传递时,我们首先要在心中有一个组织机构的概念,现假定可能的情况如下图所示: 系统刚刚建立时,管理员代表顶级机构为操作员及下属分公司进行授权分配,可能的授权范围如下图所示: 如上图所示,分公司1的权限最大只能是集合A,各级机构只能管理本级机构的操作员及本级的下级机构的权限,权限范围限于本级机构的权限,分公司... 阅读全文
摘要:
前面我们已经讨论过企业的组织机构,分为:微型企业、中小型企业、大型企业等,企业的组织机构反映了企业的管理模式,有些IBeamMDAA的概念需要清楚的理解: 当用户登录到系统后,同时反映了用户所在企业的顶级机构(Root),当前所在机构(Owner),当前用户(操作员)当事人(Identity),下面我们结合企业组织机构来认识这些属性。 微型企业: 当人员岗位1登录到系统时: Root = 顶级机构 Owner =顶级机构 Identity = 人员岗位1当事人 中小型企业: 当人员岗位1登录到系统时: Root = 顶级机构 Owner =顶级机... 阅读全文