DotNet企业开发示例程序
【说明】
本示例程序使用了NBear框架(博客员teedy开发的)和EnterpriseObjects(见wrox出版《.net企业应用高级编程》)类库来演示一个.NET企业应用的开发。
数据访问层使用NBear来实现,用范型生成的强类型集合(可惜它的实体都是用接口表示的,我想给一个实体加重载一下ToString()方法都找不到在哪儿下手),而且这个持久层框架不像NHibernate,IBatis.net等需要过多的配置文件,上手很快,比ActiveRecord还简单。示例程序中只用到了获取数据的一些方法,更新的方法没有做演示。但是NBear可以很好的处理数据库事务,但对并发更新不知道有没有支持。总之,用NBear做持久层主要是它使用简单,性能好,如果功能不够的话再手工用Ado.net来补充实现一些功能。
业务层使用了NBear.Ioc的框架。TestApp项目用来演示简单的AOP本地服务工厂,就是你把写好的业务程序集放到bin目录,修改一下配置文件就可以实现业务组件的热插拔。(关于TestApp项目的调试请查看后面的"注意"小节)。而功能比较强大的是分布式工厂的演示,ApplicationBrowser项目演示的是一个分布式服务工厂的使用,对象都通过Remoting在远程创建。本来这里想用EnterpriseObjects的RemotingServiceObjectFactory来实现的Host的,它是通过扫描程序集里标注了RemotingAttribute的类型并发布到Remoting管道,这样可以不配置Castle就可以发布对象,在写Service实现程序集的时候把类用RemotingAttribute修饰一下就会自动发布。但是本示例是基于NBear的,后来又改成用RemotingClientHelper和RemotingServiceHelper来实现了。这样的话发布服务的话,先把服务的程序集拷贝到host项目的bin目录里,然后再配置app.config就自动发布该服务了。
UI层是通过Wrox的应用程序浏览器修改成的。部署的时候只向用户部署一个应用程序浏览器就可以了,它相当于IE浏览器。ApplicationBrowser通过EnterpriseCoordinator的web服务来获取功能列表,然后通过.net自动部署功能来发布子应用程序。以后你开发了一个新功能,直接把它的程序集放在EnterpriseAssembly目录下,然后修改EnterpriseCoordinator服务(你可以修改这个服务从数据库加载功能列表)就可以让客户使用新的功能了。
企业开发涉及的方面很广,此示例程序也只是管中窥豹,略见一斑,此演示会不断完善,希望大家多提宝贵意见,把它做成一个企业开发的典型范例,方便大家参考和修改。
本程序演示了下面的一些.NET技术:
1、.NET的代码访问安全(CAS)
2、业务组件的热拔插实现
3、NBear持久层的使用
4、.NET自动部署
5、反射和Remoting技术
6、用NBear构建分布式应用
7、面向接口编程
8、AOP、SOA演示
9、Windows用户控件开发以及文档/试图模式(非MDI)
接下来我会改进本演示程序,主要演示下面的几个方面
1、利用web服务实现基于令牌的分布式身份验证和授权(SSO)
2、使用MasterPater,WebPart,Atlas开发个性化门户
3、简单的Wap应用
4、分布式事务的处理
5、用Windows服务来实现自动化处理
6、实现管理(MMC集成):管理windows服务,监视remoting状况,查看日志
7、性能计数器、报告异常、事件日志、调试跟踪和负载平衡
8、代码生成技术(CodeDom)
我的邮件是onlytiancai#msn,欢迎大家一起改进此演示。
下载地址:https://files.cnblogs.com/onlytiancai/EnterpriseDev.rar
【准备】
1、安装vs.net 2005,sqlserver 2005 express,.net sdk 2.0快速入门(用到里面的Northwind库)
2、确保.net 版本号为v2.0.50727,如果不是的话请修改build.bat文件,指向msbuild.exe的路径。
【部署说明】
为了能正常运行示例程序,请按步骤来部署,部署说明中的路径都不要变,等你看懂例子后再改变。
1、把EnterpriseDev.rar解压到D:\EnterpriseDev,双击build.bat来编译项目;
2、打开ApplicationBrowser\ApplicationBrowser.sln解决方案,它会自动创建 http://localhost/EnterpriseCoordinator的虚拟目录,如果不能自动创建,请手工把 EnterpriseCoordinator目录web共享,并启用匿名访问;
3、双击EnterpriseAssembly\UpdateAssemblies.bat自动拷贝用户控件程序集到本目录,然后把本目录web 共享,权限设置为读取和目录浏览,并启用匿名访问。
4、配置程序集权限,在SDK命令提示下输入Mscorcfg.msc,依次展开Runtime Securty Policy/Machine/CodeGroups/LocalIntranet_Zone,右键选New创建一个EnterpriseDev_Site的代码组, Condition Type选择Site,在Site里输入用户控件程序集的网站名,比如localhost,下一步后在permission set里选择FullTrust.验证程序集权限的时候在Runtime Securty Policy上右键选择Evaluate Assembly,输 入你的程序集体的路径,比如 http://localhost/EnterpriseAssembly/WawaSoft.EnterpriseDev.NorthwindControls.dll,点击下一步 如果显示权限为Unrestricted就是权限设置成功了。
5、解决方案管理器里右键点NorthwindMQServer项目,选择调试/启动新实例,如果遇到防火墙提示,点解除阻止。
6、运行CopyServiceAssembliesToHost.bat,把Service程序集拷贝到ServiceHost的Bin目录下,这一步是必须的,因为你做组件热插拔也要把组件放那里吧,然后启动NorthwindServiceHost项目的新实例.
7、启用ApplicationBrowser的新实例,点击OK按钮(没有做用户名和密码验证),在view菜单里选择vieworder菜单,这时候来自http://localhost/EnterpriseAssembly/WawaSoft.EnterpriseDev.NorthwindControls.dll的控件就会填充窗体,并会多出一个订单管理的菜单,点击创建新订单,会出现提示。选择new/new browser可以创建新浏览器实例,并打开其它子应用程序,尽管我们只开发了一个ViewOrder控件。
【注意】:
1、ApplicationBrowser.Browser.cs里的OnLoad里的menuView.MenuItems.Add(new SubApplicationDebugMenuItem(this, typeof(ViewOrderControl)));一句是用来调试的,你在开发测试的时候可以在控件项目里设置断点,然后点击view/debug viewOrder来调试应用,而如果你把程序集部署到web服务器上就不 能调试了。
2、ApplicationBrowser.Browser.cs的SubApp属性里的DisplayAssemblyInfo(_subApp);一句是用来调试的 ,它的作用是显示程序集体的权限和证据等信息。
3、在开发用户控件的时候不要往window和help里面加菜单,可以往View里加,如Browser.AddMenuItem (this, "View", itemHelp);
4、castle的配置文件一定要写对,接口实现类的程序集(NorthwindService)必须要拷贝到最终使用服务的bin目录下。比如说要用TestApp项目来测试,就要把NorthwindService程序集的主输出拷贝到TestApp项目的bin目录下(运行CopyServiceAssembliesToTestApp.bat)。
5、TestApp应用的app.config里没有设置remoting的相关参数,修改NorthwindControls\ViewOrderControl.cs里的service = RemotingServiceFactory.GetService<INorthwindService>();为service = ServiceFactory.GetService<INorthwindService>();才可以调试testapp.
5、DelBin&Obj.vbs是用来删除每个项目下的obj和bin目录的,不会写循环子目录的批处理,就用vbs写了一个,执行后文件就小了,给大家发布的时候也小一些。