[转载](asp.net大型项目实践)
首先感谢:传说中的弦哥http://www.cnblogs.com/legendxian/
关键词::NHibinate,Json,SOA,大型三甲医院信息管理系统。------
医院信息系统(HospitalInformationSystem,HIS)
1.开发环境准备...
Microsoft Visual Studio 2008
Microsoft Visual Studio 2008 Sp1(补丁)
Microsoft ASP.NET MVC 1.0
2.对于大型项目而言,模块和代码众多,我们可以通过“解决方案文件夹”来对项目进行合理的管理,如:
lib文件夹用来存放项目中引用的第三方dll(这样有个好处,你可以把DLL拖进去,这样当你项目绑定VSS后,这些DLL大家就可以通过VSS获取了)
Presentation(展示层)用来存放UI层相关代码
因为项目模块众多,我们可以按照粗粒度的模块进行划分如Infrastructure(基础数据设置模块),住院模块,门诊挂号模块....
注:解决方案文件夹可以用中文,你也可以按照你的习惯和具体项目情况进行划分,总的原则就是方便管理和查看
数据访问层Repositories:主要用NHibernate访问数据库,但也有可能去访问其他模块或系统的WebService,也有可能用Linq去访问一些缓存(内存中的)数据,也有可能访问XML,文本文件等等....
业务领域层Core:系统的核心层,所有与数据访问无关的业务逻辑都应该内聚在这里,业务领域对象理论上应该是充血的,内聚自己的业务逻辑。但有一些业务逻辑在设计的时候涉及到了多个业务领域对象 ,我们很难决定放在哪个具体的业务对象里,所以我们有一个Service层来放这种业务逻辑。
装饰层Facade:把数据访问接口,业务领域对象的业务逻辑,Service接口简单的封装一下成为Facade层接口供展示层UI或SOA层调用,这个层需要注意的是它只是简单的封装,免得UI层调太多层的接口,这层不应含有业务逻辑。
SOA层:因为系统比较庞大模块很多,且业务上要求各大模块间需要一定解耦,所以这一层作用是作为各大粗粒度模块间调用以及给其他系统调用,比如有基础数据管理大模块和门诊挂号大模块,他们之间的调用是必须要通过SOA层的,而不能直接走Facade层,传输的对象应该新建DTO数据传输对象,而不应该直接传递业务领域对象,从而通过SOA层我们把各个粗粒度模块完全隔离开。这个层取名为SOA也许不大恰当,大家也不必深究...计划是采用WCF 这样可以灵活的配置通讯方式
表现层Presentation:由Asp.net MVC的Action给ExtJs传输数据 ,Controler只需调用Facade接口
公共类库FrameWork:整个项目框架的公用代码,相当于公共类库,也许叫FrameWork不大恰当 呵呵
注意修改一下项目的命名空间,如Demo.HIS.Infrastructure.Core [公司名].[项目名].[大模块名].[分层名]....在实际项目中合理的命名空间是很重要的
最后在解决方案根目录下新建一个类库Demo.HIS.FrameWork作为我们的公共类库就完成了,最后的项目结构是这样的:
1.
按照国际惯例,我们新建一个抽象类,作为我们系统中所有业务对象的基类,将来可以用来识别哪些类是我们自己的业务对象类
2一般在信息管理系统中,大多数的业务对象都需要持久到数据库,所以我们再新建一个抽象类作为所有可以被持久化的业务对象都要继承的基类
namespace Demo.HIS.FrameWork.DomainBase
{
/// <summary>
/// 系统所有业务类都要继承的基类
/// </summary>
[Serializable]
public abstract class BaseObject
{
}
}
namespace Demo.HIS.FrameWork.DomainBase
{
/// <summary>
/// 可以持久到数据库的业务类都要继承的基类
/// </summary>
public abstract class Entity : BaseObject
{
public Entity()
{
Id = Guid.NewGuid().ToString();
CreateTime = DateTime.Now;
IsDelete = false;
}
public virtual string Id { get; protected set; }
public virtual DateTime CreateTime { get; protected set; }
public virtual bool IsDelete { get; set; }
public virtual Int32 Version { get; protected set; }
}
}
a.Entity继承了BaseObject。因为Entiy也是业务对象,只不过它是可以持久化的业务对象。
b.为啥所有属性都要用 virtual? 因为我们需要用NHibernate来做持久化,它要求属性必须是virtual,如果你还要问为啥NHibernate需要用virtual,据我所知 NHibernate移植自Java的Hibernate,在Java里virtual是常态,为了移植方便所以沿用...其实就算NHibernate不需要virtual,我也会写成virtual....这样子类可以重写,是不是很罗嗦....?
c.所有可以持久到数据库中对象都有Id属性,别告诉你数据库里的表没有Id字段做为主键(特殊情况可能没有...比如多对多关联表)。为啥我的 Id数据类型是string? 项目很大,生命周期也长,指不定啥时候因为某种原因需要改变Id的数据类型(我就遇到过...)所以我们不把Id的数据类型定死为int或guid,而且把Id的生成方式放在这个基类的构造函数里,注意Id = Guid.NewGuid().ToString();这里我们的Id生成方式采用GUID。
d.为了防止误删除,以及一些表间关联情况下删除而导致程序出错,我们系统中默认的删除一般都是逻辑删除,所以用IsDelete字段进行标识(这样可能产生不少垃圾数据,以后我们可以进行过期删除处理或转移之类的功能来避免)。
e.Version字段是 提供给NHibernate处理并发用的。
f.CreateTime有啥用?我也不知道....
1应用场景举例之InputItem
在我们的项目中经常需要用到各种下拉选择项,而且客户要求很BT,供选择的项可能从几个到上万个不等,而且为了快速录入需要模糊输入汉字,编码,拼音,五笔都可以检索到想要选择的项,如下图(这是B/S的用EXT实现):
2应用场景举例之User
比如在我们的项目中可能登录我们系统的用户角色可能有 医生,护士,患者,医院行政人员,这几个对象的都应该属于系统用户对象
所以我们可以建立一个User抽象类,包含基本的用户名,密码等属性,且包含一些系统用户的方法比如登录,注销,修改密码等等....
然后针对 医生,护士,患者,医院行政人员这几个对象分别建类继承User抽象类,各自的对象中包含各自的属性和方法
具体的代码我就不贴了,反正这个系列以后会讲到..
HIS系统
一、HIS的定义
(一)医院信息系统的定义
医院信息系统(HospitalInformationSystem,HIS)在国际学术界已公认为新兴的医学信息学(MedicalInformatics)的重要分支。美国该领域的著名教授Morris.Collen于1988年曾著文为医院信息系统下了如下定义:利用电子计算机和通讯设备,为医院所属各部门提供病人诊疗信息和行政管理信息的收集、存储、处理、提取和数据交换的能力,并满足所有授权用户的功能需求。
完整的HIS系统实现了信息的全过程追踪和动态管理,从而做到简化患者的诊疗过程,优化就诊环境,改变目前排队多、等候时间长、秩序混乱的局面。
八、医院信息系统子系统的划分
医院信息系统所包含的内容纷繁复杂,依其在一个医院的实现先后,大体可以分为以下三个阶段:
1.管理信息系统
管理信息系统一般包括:
门、急诊挂号子系统
门、急诊病人管理及计价收费子系统
住院病人管理子系统
药库、药房管理子系统
病案管理子系统
医疗统计子系统
人事、工资管理子系统
财务管理与医院经济核算子系统
医院后勤物资供应子系统
固定资产、医疗设备管理子系统
院长办公综合查询与辅助决策支持系统
2.临床医疗信息系统
临床医疗信息系统可能包括的内容很多,甚至可能是专科、专病、专课题的信息处理系统,下面给出一些常见系统的例子:
住院病人医嘱处理子系统
护理信息系统
门诊医生工作站系统
临床实验室检查报告子系统
医学影像诊断报告处理系统
放射科信息管理系统
手术室管理子系统
功能检查科室信息管理子系统
病理卡片管理及病理科信息系统
血库管理子系统
营养与膳食计划管理子系统
临床用药咨询与控制子系统
3.医院信息系统的高级应用
医学图象实时传输与查询、归档系统
(PictureArchivingandCommunicationSystem,PACS)
病人床边信息系统
计算机化的病人病案系统(CPR)
科研支持系统
教学支持系统
Internet医学情报系统
远程诊断与教学
RM
[编辑本段]
一、Object/Relation Mapping
对象-关系数据库映射
什么是ORM?
对象关系映射(ORM)提供了概念性的、易于理解的模型化数据的方法。ORM方法论基于三个核心原则:
简单:以最基本的形式建模数据。
传达性:数据库结构被任何人都能理解的语言文档化。
精确性:基于数据模型创建正确标准化了的结构。
典型地,建模者通过收集来自那些熟悉应用程序但不熟练的数据建模者的人的信息开发信息模型。建模者必须能够用非技术企业专家可以理解的术语在概念层次上与数据结构进行通讯。建模者也必须能以简单的单元分析信息,对样本数据进行处理。ORM专门被设计为改进这种联系。
规则表达式
ORM把应用程序世界表示为具有角色(关系中的部分)的一组对象(实体或值)。ORM有时也称为基于事实的建模,因为它把相关数据描述为基本事实。这些事实如果分割为再小的事实就会丢失信息。
ext
1.ExtJs的简称,是一个强大的js类库
ext是一个强大的js类库,以前是基于YAHOO-UI,现在已经完全独立了,
主要包括data,widget,form,grid,dd,menu,其中最强大的应该算 grid了,编程思想是基于面对对象编程(oop),扩展性相当的好.可以自己写扩展.自己定义命名空间.web应用可能感觉太大.不过您可以根据需要按需加载您想要的类库就可以了.
主要包括三个大的文件ext-all.css,ext-base.js,ext-all.js(包括所有的类库,您可以根据需要进行删减.官方网站提供这一接口),在引用ext类库的时候.这三个文件必不可少.
它提供了丰富的,非常漂亮的外观体验,成为众多界面层开发人员的追捧!其核心的组件基本覆盖了我们构建富客户端的常用的组件。
什么是JSON?
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。
XML和JSON都使用结构化方法来标记数据,下面来做一个简单的比较。
用XML表示中国部分省市数据如下:
<?xml version="1.0" encoding="utf-8"?>
<country>
<name>中国</name>
<province>
<name>黑龙江</name>
<citys>
<city>哈尔滨</city>
<city>大庆</city>
</citys>
</province>
<province>
<name>广东</name>
<citys>
<city>广州</city>
<city>深圳</city>
<city>珠海</city>
</citys>
</province>
<province>
<name>台湾</name>
<citys>
<city>台北</city>
<city>高雄</city>
</citys>
</province>
</country>
用JSON表示如下:
{
name:"中国",
province:[
{
name:"黑龙江",
citys:{
city:["哈尔滨","大庆"]
}
},
{
name:"广东",
citys:{
city:["广州","深圳","珠海"]
}
},
{
name:"台湾",
citys:{
city:["台北","高雄"]
}
}
]
}
编码的可读性,xml有明显的优势,毕竟人类的语言更贴近这样的说明结构。json读起来更像一个数据块,读起来就比较费解了。不过,我们读起来费解的语言,恰恰是适合机器阅读,所以通过json的索引.province[0].name就能够读取“黑龙江”这个值。
编码的手写难度来说,xml还是舒服一些,好读当然就好写。不过写出来的字符JSON就明显少很多。去掉空白制表以及换行的话,JSON就是密密麻麻的有用数据,而xml却包含很多重复的标记字符。