幸福框架:如何阅读幸福框架的代码
幸福框架:如何阅读幸福框架的代码
HappyFramework 是一个支持DDD、CQRS、OSGI、EPC、EventDriven、MetadataDrivenProgramm理念的开源框架,而且她是可以实战的。
不要被上边的话给欺骗了,当然了,其实也没有欺骗大家,只是 HappyFramework 的CQRS、OSGI、EPC、EventDrivent、MetadataDrivenProgramming都是实现的很简单,全是限制在AppDomain内和仅支持单线程。这并不代表不可以跨越AppDomain甚至无理进程,或者支持多线程,只是如果想做到这一步,已经有很多的框架提供此类功能了,如:NServiceBus之类的框架。而 HappyFramework 可以和他们结合起来一起使用的。
下面对整个框架的组织方式和理念做一个简单的介绍,有朋友想阅读这个框架也可以按照这个顺序。
项目组织方式(忽略对单元测试项目的介绍)
Happy,此项目包含了所有基类和接口,不对其它项目有任何引用。 Happy.Data.EntityFramework,使用EntityFramework实现了仓储和工作单元,后面计划提供Happy.Data.HHibernate,CQRS的Command部分的数据库访问代码会使用此空间。 Happy.Data.FluentData,使用FluentData实现了查询服务和查询数据源,CQRS的Query部分的数据访问代码会使用此空间。 Happy.EnterpriseLibrary,使用了EnterpriseLibrary实现了日志功能和异常管理功能。 Happy.Ioc.Unity,使用Unity管理AppDomain内的服务,实现了IBundleContainerPlug,当Bundle启动的时候根据约定注册类型到Unity中,当Bundle停止的时候根据约定取消类型的注册;提供了IUnityRegister接口,当Bundle启动时会自动调用所在Assembly中实现了此接口的类型,开发人员可以实现这个接口来自定义注册。 Happy.Web.Mvc,重写了ControllerFactory,以支持识别动态加载的Bundle中的Controller,而且当Bundle停止时,要取消对相应Conroller的识别。Happy.DesignByContract介绍
“Happy.DesignByContract”命名空间下的代码基本全是拷贝自“sharparchitecture”,对于契约式开发,我还没有深入了解,正在学习中。
“sharparchitecture”下载地址:http://sharparchitecture.net/。
Happy.Specifications介绍
“Happy.Specifications”命名空间下的代码基本全是拷贝自“microsoftnlayerapp”,其理念基础是领域驱动设计的“规约模式”,我之所以没有将其组织到“Happy.Domain”命名空间的原因是“Happy.Queries”命名空间也需要“规约模式”。
关于规约模式我是这么理解的,规约分查询规约、创建规约、验证规约,其中查询规约又分数据库查询规约和内存查询规约,“Happy.Specifications”命名空间下实现的是“数据库查询规约”,也叫“查询对象”,其它规约类型我会提供独自的继承体系。
“microsoftnlayerapp”下载地址:http://microsoftnlayerapp.codeplex测试数据/。
Happy.Logging介绍
“Happy.Logging”的开发受到了“log4net”的影响,原本我想用其提供的NuGet包进行开发,后来之所以
决定引入隔离接口,有如下原因:
核心类型说明:
ILoger :完全拷贝自“log4net”。 ILogerFactory :简单工厂模式。 LogHelper :门面模式。 EmptyLoger :NullObject模式。 EmptyLogerFactory:NullObject模式。“log4net”下载地址:http://logging.apache.org/log4net/。
Happy.ExceptionHandling介绍
“Happy.ExceptionHandling”的开发受到了“ENTERPRISE LIBRARY”的影响,原本我想用其提供的NuGet包进行开发,后来之所以决定引入隔离接口,有如下原因:
我不希望绑定到特定的日志实现。 不希望依赖太多外部程序集。"ENTERPRISE LIBRARY"下载地址:https://entlib.codeplex测试数据/。
Happy.ExtensionMethods介绍
“Happy.ExtensionMethods”命名空间下的代码基本全是拷贝自“Craig's Utility Library”,原本我想用其提供的NuGet包进行开发,后来之所以决定进行拷贝式复用,有如下原因:
我只需要简单的功能。 拷贝的过程也是我学习的过程。 不希望依赖太多外部程序集。“Craig's Utility Library”下载地址: http://cul.codeplex测试数据/、 http://HdhCmsTestgutgames测试数据/。
Happy.Messaging介绍
“Happy.Messaging”的开发受到了“sharparchitecture”的影响,其理念基础是“命令模式”、“发布订阅模式”、“管道过滤器模式”,我准备使用三种消息机制,DomainEvent、ApplicationEvent、Command,他们三者共享一个一个基类框架(Happy.Messaging)。
关于DomainEvent、ApplicationEvent、Command的一些简单使用场景:http://HdhCmsTestcnblogs测试数据/happyframework/archive/2013/03/09/2949838.html
核心类型说明:
“sharparchitecture”下载地址:http://sharparchitecture.net/。
Happy.OSGI介绍
“Happy.OSGI”命名空间实现了简单的OSGI思想,OSGI的核心理念是管理Bundle的生命周期(安装、启动、停止)。
核心类型说明:
Bundle :Bundle实例,你可以启动它、停止它,但是不能卸载它。 BundleAttribute :Bundle标注,程序集被标注后,就会被识别为一个Bundle。 BundleContainer :Bundle容器,一个AppDomain只有一个BundleContainer,它来管理所有Bundle实例。 BundleContext :Bundle上下文,代表了Bundle当前的上下文信息,在IBundleListener被调用时,会传递给IBundleListener的Start和Stop方法。 BundleData :Bundle元数据,代表了一个Bundle的原信息,目前只有Assembly,后面会扩充更多信息。 IAssemblyLoader :程序集加载器,BundleContainer可以使用多个程序集加载器加载Bundle。 IBundleContainerPlug :BundleContainer插件,Bundle的Start和Stop方法执行时,会自动调用的所有IBundleContainerPlug,如:Ioc自动注册插件可以自动注册Ioc容器。 IBundleListener :Bundle监听者,Bundle的Start和Stop方法执行时,会自动调用Bundle所在Assembly的所有IBundleListener。Happy.Domain介绍
“Happy.Domain”命名空间下的代码借鉴了“microsoftnlayerapp”,其理念基础是领域驱动设计。
“microsoftnlayerapp”下载地址:http://microsoftnlayerapp.codeplex测试数据/。
Happy.Queries介绍
“Happy.Queries”命名空间封装了UI层常用的查询API,此命名空间体现了CQRS的Q。关于如何处理系统的查询,我是这么
理解的,代码中不要出现复杂的查询,复杂的查询应当放到数据库中,通过存储过程或视图实现,程序中只能出现简单的Where查询。
元数据驱动开发也会在该层体现,通过为ViewModel设置应有的元数据,可以在编译时或运行时自动生成UI。
Happy.Commands介绍
“Happy.Commands”继承“Happy.Messaging”的所有实现,为Create、Deleting、Updating提供几个常见的命令基类。CommandBus主要用在控制器层向应用层传递消息,即纵向传递。
Happy.Application介绍
“Happy.Application”继承“Happy.Messaging”的所有实现,为Create、Deleting、Updating提供几个常见的命令处理器基类。ApplicationBus主要用在业务模块和业务模块之间的消息传递,即横向传递。
备注:还是有些乱,找个时间再重新整理一下。
分类: Happy Framework
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于幸福框架:如何阅读幸福框架的代码的详细内容...