Module Interface Separation

Retired Content

This content is outdated and is no longer being maintained. It is provided as a courtesy for individuals who are still using these technologies.
This page may contain URLs that were valid when originally published, but now link to sites or pages that no longer exist.

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.

Ff709853.72380fdb-8174-4a1c-b5f1-14655ab2ca4d(en-us,PandP.10).png

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.

Ff709853.9d97714a-33ad-4376-8bc3-aa421d08d744(en-us,PandP.10).png

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.