V minulém postu jsem nastínil způsob, jak lze kontrolovat zakázané závislosti mezi třídami v aplikaci. Trochu jsem si zaexperimentoval a vytvořil knihovnu StructureAssertions a NuGet balíček, který si můžete nainstalovat do testovacího projektu a jednoduše závislosti otestovat.
Balíček se jmenuje StructureAssertions a můžete ho nainstalovat standardní cestou přes správce NuGet balíčků nebo powershellí příkazovou řádku. Trochu jsem pozměnil názvy metod, takže test bude nyní vypadat takto:
[Test] public void ModelsDoNotReferenceControllers() { AssertStructure .InAssemblyContaining<User>() .Types(type => type.Namespace.EndsWith(".Models")) .MustNotReference(reference => reference.Namespace.EndsWith(".Controllers")); }
Zdrojový kód najdete na githubu, budu rád když mě forknete;) Snažil jsem se napsat co nejvíc testů na různé způsoby zavedení dependence do třídy, ale je možné, že nejsou kompletní. Pokud by jste přišli na to, že některé závislosti nejsou detekovány, dejte mi prosím vědět.
Pěkná knihovna, taky jsem zhruba před rokem dostal podobný nápad a vzniklo z toho Patterns4Net: člověk v kódu označí návrhové vzory pomocí atributů, např. [Decorator]class CachingRepository..., a Patterns4Net potom zkontrolují, jestli ta třída odpovídá strukturální specifikaci daného vzoru.
API pro tuhle strukturální specifikaci je dost podobné :-) Taky jsem použil Mono.Cecil a chtěl jsem umožnit i uživatelskou definici vzoru, narazil jsem ovšem na to, že Cecil poskytuje pouze dost nízkoúrovňový pohled na typy/metody/atd. Spoustu věcí si člověk musí zjistit sám, např. jesli daná metoda overriduje jinou metodu předka se v MSIL určuje většinou čistě podle jména a signatury, takže Mono.Cecil nenabízí žádnou metodu jako Overrides(MethodReference):bool. Kvůli tomu jsem implementoval spoustu extension method, třeba by se v budoucnu mohly hodit pro StructuralAssertions. Viz např. http://patterns4net.codeplex.com/SourceControl/changeset/view/64e8be9ec4e8#src%2fPatterns4Net.Core%2fCecilExtensions%2fMethodExtensions.cs
Jinak do budoucna si myslím, že napodobné analýzy bude nejlepší Roslyn, už se těším až bude v nějaké použitelné verzi, nebo ještě líp, až bude součástí Visual Studia.
@Steves To vypadá zajímavě, mrknu na to až bude čas.