- 问题
你有一个大型的智能客户端应用程序,这个程序有许多不同团队开发的不同模块组成。一些模块需要依赖另外一些模块,例如:帐户模块需要基础模块中的日志服务,如果要访问这个日志服务,帐户模块必须先引用基础模块的程序集,每当基础模块的代码发生更改,帐户模块也必须重新编译。以下插图显示应用程序模块之间的依赖关系:

Figure 1 Module dependencies
- 解决方案
这个问题可以通过将一个模块分离成两个程序集来解决:
-
接口程序集
-
模块实现程序集
接口程序集需要包含以下类型的公共元素:
-
服务接口(Service Interfaces)
-
命令(Commands)
-
常量(Constants)
-
命令名称(Command Names)
-
事件主题名称(Event Topic Names)
-
界面扩展组件名称(UI Extension Site Names)
-
工作区名称(Workspace Names)
-
业务实体(Business Entities)
模块实现程序集包含模块的具体实现,这样你就可以更改模块的实现而无须重新编译其他具有依赖的模块,那些依赖的模块仅在接口程序集改变时才需要重新编译。以下插图表示模块和接口程序集之间的依赖关系:
Figure 2 Separation of interface and implementation for modules
- 示例
银行客户端参考实现项目中所有模块都是按照以上模式设计的。我们可以通过查看Infrastructure.Interface程序集以及相关的Infrastructure.Module程序集来了解其实现方式。