
Reference Inspector is a simple build-time tool to enforce
layering and dependency rules between .NET assemblies.
When used with a continuous integration server like
CruiseControl.NET,
Reference Inspector helps you detect violations of a system's
intended architectural dependencies as soon as they occur, rather
than later when they may be much harder to back out.
The kinds of problems prevented by using Reference Inspector are:
Unwanted deployment dependencies on non-redistributable or
bulky components
Violations of major layering objectives, such as dependencies
between the business and user interface layers
Dependencies between new code and deprecated/legacy code
An added advantage is that the reference rules can record and
communicate the high-level intentions of a system's architects to new
developers and future maintainers.
Reference Inspector is similar in intent to FxCop,
however while FxCop is intended to enforce best practices through a
vast number of generic rules, and at the level of a single assembly,
Reference Inspector works on the relationships between assemblies to
enforce rules that are highly specific to that particular project.
Status
Beta. Still working out the finer points of implementation. The
current rule language is very usable, however it would benefit from
less verbosity and more flexibility. If major changes in the rule
definition syntax are made, conversion tools will be available.
Download and Installation
The executable is available here.
No installation is required, but the .NET Framework version 2.0 or
above must be available.
Rules
Each system analysed by Reference Inspector requires a rules file,
by convention named ProjectName.ri.xml. This is an XML
document of the following form:
<?xml
version="1.0"
encoding="utf-8"
?>
<ReferenceRules>
<IgnoreFrom
Pattern="*.Tests"
/>
<IgnoreTo
Pattern="System.Xml*"
/>
<Prevent>
<From>
<Assembly
Pattern="MyApp.Server"/>
</From>
<To>
<Assembly
Pattern="MyApp.Client"/>
</To>
</Prevent>
<PreventFrom>
<Assembly
Pattern="MyApp.Model*"/>
<ExceptTo>
<Assembly
Pattern="MyApp.Interfaces"/>
</ExceptTo>
</PreventFrom>
<PreventTo>
<Assembly
Pattern="System.Windows*"/>
<Assembly
Pattern="System.Drawing"/>
<ExceptFrom>
<Assembly
Pattern="MyApp.UI"
/>
<Assembly
Pattern="MyApp.Controls"
/>
</ExceptFrom>
</PreventTo>
</ReferenceRules>
IgnoreFrom
Assemblies matching IgnoreFrom rules
will be ignored. This is handy for third-party components that are
present in the binary deployment, or for unit test assemblies that
may violate layering rules in order to provide stub functionality.
IgnoreTo
References to assemblies matched by
IgnoreTo rules will not be checked. This is useful for libraries that
are referenced by most of the project.
Prevent
The simplest rule – forbids any
of the assemblies in the From list to reference any of the assemblies
in the To list.
PreventFrom
These rules control the outgoing
references of an assembly, and are the most useful for enforcing
layering rules.
PreventTo
These rules prevent references to
components that may be deprecated or require encapsulating behind
wrapper assemblies (e.g. to prevent widespread dependencies on
third-party components.)
Usage
ReferenceInspector works by recursively searching for assemblies
in a specified directory. It is run from the command line with the
following syntax:
ReferenceInspector.exe <rules>
<searchDir>
The results of the check are printed to the console, with the app
returning a non-zero exit code when rule violations are found.
Future Directions
If you'd like to suggest any improvements to Reference Inspector,
email the developers. Some of
the ideas so far are:
A CruiseControl.NET plugin
An FxCop plugin
Class/Namespace level analysis
An XSD for the rule file schema
Are you using Reference Inspector?
If so, we'd love to know! Email Nicholas
Blumhardt to be listed here.