Problem
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.
Figure 1
Module dependencies
Forces
- You want to be able to change the implementation of a module without requiring a recompilation of dependent modules.
Solution
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
- 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.
Figure 2
Separation of interface and implementation for modules
Liabilities
- Your solution contains more projects to manage.
More Information
The Add Business Module and Add Foundational Module recipes include an option to automatically generate an interface project for the module being created. For more information, see How to: Create a Business Module and How to: Create a Foundational Module.