模块化应用程序是指可以在不修改核心应用程序代码的情况下扩展基本功能和数据模型的应用程序.
这是一种流行的方法,例如.像SugarCRM或VTiger这样的开源CRM.
在asp.net mvc应用程序中可以使用区域或(来自MVC contrib的可移植区域)遵循这种方法,这允许在单独的程序集中添加新的控制器和视图,而不会影响核心dll.
当想要扩展基础应用程序的数据模型时,就会出现问题.在实际框架中,模型定义集中在Edmx文件中是不可能的.此方法不允许添加将引用新程序集中的某个基本模块表的新表.
我注意到,Orchard CMS通过使用nHibernate实现了完全的模块化(这是有说服力的,因为他们有微软的支持并且该项目被视为技术展示).由于POCO方法,Nhibernate允许这种模块化.每个实体/表都在一个单独的文件中定义,这显然是模块化应用程序的方式.
然而,对于Entity Framework Code Only方法存在希望,该方法使用POCO定义在运行时生成Edmx模型.有没有人尝试过这种方法在单独的可插拔项目中分发数据模型的定义?
解决方法
我使用EF Code First和核心模块上的GUI扩展点组合实现了这一点.结果是:
>每个模块都被视为独立应用程序(GUI除外)
>每个模块都有自己的数据库(因为代码首先丢弃并重新创建数据库)
>每个模块可以在另一个模块中复制所需的数据
>每个模块都是一项服务
>每个模块都可以通过IoC容器通过核心扩展点扩展GUI
>模块可以通过异步消息传递(nServiceBus)和同步RPC(WCF)与每个模块进行通信
请注意,这是我们为SOA设计的企业应用程序.
使用EF Code First,如果您手动管理数据库(即不要删除和重新创建),您可以采用上面的一些概念并简化它.您可能需要一个自定义IDatabaseInitializer来支持它,但它应该是可能的.