Module Interface Separation
This content is outdated and is no longer being maintained. It is provided as a courtesy for individuals who are still using these technologies.
You have a large smart client application that is composed of multiple modules written by different teams. Some modules have dependencies on other modules. For example, the accounts module requires the logging service in the infrastructure module. To access the logging service interface, the accounts module has an assembly reference to the infrastructure module assembly. Each time the implementation of the infrastructure module changes, the accounts module must be recompiled. Figure 1 illustrates the dependencies between application modules.
The problem is solved by breaking the module into two assemblies:
- The interface assembly
- The module implementation assembly
The interface assembly should contain public elements of the following types:
- Service interfaces
- Constants, including:
- Command names
- Event topic names
- UI extension site names
- Workspace names
- Business entities (if they are passed between modules)
The module implementation assembly contains the implementation of your module. In this way, you can change the implementation of a module without requiring a recompilation of dependent modules. The dependent modules must be recompiled only when the interface assembly changes. Figure 2 illustrates the dependencies between modules and the interface assemblies.
Separation of interface and implementation for modules