Introduction
Dependency validation helps to keep the code architecture clean and rules enforced. The video below gives a quick introduction to the dependency validation in Visual Studio.
Recently a friend, asked about enforcing constraints in a project architecture, I explained this to him. But I haven’t used it any of my previous projects (we’re good developers who do not spoil the code :P) , so thought of giving it a try. As shown in the video things should be straight forward but I ended up my validations never kicked in.
With some investigation, I found that when we add the DV project to the solution it adds the following package to all the projects.
Microsoft.DependencyValidation.Analyzers
If your project is made out from a .net core / asp.net core project template then it fails to install the above NuGet package and obviously the validation does not work.
How to fix this ?
I created a ASP.NET Core project based on .NET Framework (same applies to .NET Core as well). Added some class libraries and draw a following dependency validation layered diagram.
Red one is the web project (asp.net core) and others are simple class libraries. The structure is not complex. Just to check the validation, I referenced the DataContext in the web project as below.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public void ConfigureServices(IServiceCollection services) | |
{ | |
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); | |
// This is right | |
services.AddSingleton<IProductService, ProductService>(); | |
// this is wrong and DV should fail | |
services.AddSingleton<IMyDbContext, MyDbContext>(); | |
} |
But the validation never fired.
In order to do get this work.
- Install the following NuGet in the ASP.NET Core / .NET Core template based projects in the solution. Other projects have it installed automatically when we add the DV project.
Install-Package Microsoft.DependencyValidation.Analyzers -Version 0.9.0
- Open the ASP.NET Core template project file. Add the following. line numbers 15-18 should be manually added to include the DV diagram in the asp.net core web project.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<Project Sdk="Microsoft.NET.Sdk.Web"> | |
<PropertyGroup> | |
<TargetFramework>net471</TargetFramework> | |
</PropertyGroup> | |
<ItemGroup> | |
<Folder Include="wwwroot\" /> | |
</ItemGroup> | |
<ItemGroup> | |
…. | |
<PackageReference Include="Microsoft.DependencyValidation.Analyzers" Version="0.9.0" /> | |
<AdditionalFiles Include="..\DependencyValidation\DependencyValidation.layerdiagram"> | |
<Link>DependencyValidation.layerdiagram</Link> | |
<Visible>True</Visible> | |
</AdditionalFiles> | |
</ItemGroup> | |
<ItemGroup> | |
<ProjectReference Include="..\LayeredProject.DataContext\LayeredProject.DataContext.csproj" /> | |
<ProjectReference Include="..\LayeredProject.Services\LayeredProject.Services.csproj" /> | |
</ItemGroup> | |
</Project> |
After this all set with one small problem. Now, when we build the project, the validation kicks and the build will fail.
But the error response from Visual Studio is not consistence. It will always fail the build – that’s 100% expected behavior and it is right. But sometimes the error only appears in the Output window and not in the Error List. Also, sometimes the red squiggly does not appear.
This happens because the ASP.NET Core / .NET Core project templates do not support the DV, we did a workaround to make it work and it has some links broken to display the error message in the Error List, I hope soon Microsoft will add support to the DV in ASP.NET Core and .NET Core based project templates.
You can check / reproduce this, using the following two branches. The ‘normal’ branch has problem and the ‘solved’ branch is patch applied.
https://github.com/thuru/aspnetcore-dv/tree/normal
https://github.com/thuru/aspnetcore-dv/tree/solved
Used tooling
- VS 2017 Enterprise (15.7.4)
- ASP.NET Core 2.1
- .NET Framework 4.7.1