ArchUnitNET
ArchUnitNET copied to clipboard
How do I check the "App Services / Domain Services" rule?

I want to make sure that Application Services don't call other Application Services and call DomainServices instead.
private IObjectProvider<Class> AppServices = Classes().That().HaveName(@"\S+AppService", true);
//...
Classes().That().Are(AppServices).Should().NotCallAny(
MethodMembers().That().AreDeclaredIn(AppServices)
);
However, code like this violates this rule
public class MyAppService
{
public void Smth(){}
public void SmthElse()
{
Smth();
}
}
Is there a way to exclude "self" from the rule? If not, is there any other workaround?
Hello @max-arshinov, a workaround at this time would be:
var AppServices = Classes().That().HaveName(@"\S+AppService", true);
foreach (var appService in AppServices.GetObjects(ARCHITECTURE))
{
Classes()
.That()
.Are(AppServices)
.And()
.AreNot(appService)
.Should()
.NotCallAny(MethodMembers().That().AreDeclaredIn(appService))
.Check(ARCHITECTURE);
}
or similarly:
var AppServices = Classes().That().HaveName(@"\S+AppService", true);
foreach (var appService in AppServices.GetObjects(ARCHITECTURE))
{
Classes()
.That()
.Are(appService)
.Should()
.NotCallAny(
MethodMembers()
.That()
.AreDeclaredIn(AppServices)
.And()
.AreNotDeclaredIn(appService)
)
.Check(ARCHITECTURE);
}
We have a similar case in #229 where self references lead to such a problem and are working on a solution.
@max-arshinov since it is already possible to solve this with the existing syntax I'll close this for now. Feel free to reopen if you have any other questions