Skip to content

Implementing Business Rules Domain Policies

Mehmet Özkaya edited this page Apr 18, 2019 · 2 revisions

Business Rules - Domain Policies is created to ensure that the logical rules in an object are received from the outside. The rules of business are in a chain of successive chains, which may also reveal a more complex business rule.

I want to continue with a code example to understand the logic. In repository Domain Policies implemented by interface definition ;

 public interface IIssueAssignmentPolicy { void CheckAssignment(Issue issue, User user); }

These definition and below implementation located in Core layer.

public class IssueAssignmentPolicy : IIssueAssignmentPolicy { private readonly IIssueRepository _issueRepository; private readonly IIssueAssignmentConfiguration _configuration; public IssueAssignmentPolicy(IIssueRepository issueRepository, IIssueAssignmentConfiguration configuration) { _issueRepository = issueRepository ?? throw new ArgumentNullException(nameof(issueRepository)); _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); } public void CheckAssignment(Issue issue, User user) { if(_issueRepository.GetOpenIssueCountOfUser(user.Id) >= _configuration.MaxConcurrentOpenIssueCountForAUser) { throw new IssueAssignmentException($"Can not assign more than {_configuration.MaxConcurrentOpenIssueCountForAUser} open issues to a user!"); } } }

After definitions of rules, we should use this policies into domain functions as below way;

 public void AssignTo([Required] User user, [Required] IIssueAssignmentPolicy policy) { Check.NotNull(user, nameof(user)); Check.NotNull(policy, nameof(policy)); policy.CheckAssignment(this, user); AssignedUserId = user.Id; }

So by this way, we can able to manage domain related business rules into the Core Entity objects. That means we protect to our entities unmanaged modifications.

Clone this wiki locally