Comments (2)
My understanding from a lot of other guides (and including this repo as a driving source for my own implementation) is that the business / domain logic should be held within the domain (see the readme in domain project). At the time of writing this, business rules / domain logic hasn't been really implemented.
The only example that I have found so far is within ChangeEmployeeReportToCommandHandler which restricts an employee from reporting to themselves. For this example, you could handle it within an AbstractValidator
as such:
public class ChangeEmployeeReportToCommandValidator : AbstractValidator<ChangeEmployeeReportToCommand>
{
public ChangeEmployeeReportToCommandValidator()
{
RuleFor(x => x.ManagerId).NotEqual(x => x.EmployeeId);
}
}
Or you could implement it within the Employee
entity in the domain:
public class Employee
{
// Properties...
public int ManagerId { get; private set; } // Notice private setter
public Employee Manager { get; private set; } // Notice private setter
public void ChangeManager(Employee manager)
{
if (EmployeeId == manager.EmployeeId) throw new Exception("An employee cannot manage themselves");
Manager = manager;
}
public SomeValidationResult Validate()
{
if (ManagerId == EmployeeId) // Add a validation error
return // validation error(s);
}
}
You could also change ChangeManager
to not throw exceptions and return some sort of validation results instead.
Example 1 has the advantage of preventing a database call and the disadvantage having to repeat yourself if you need to prevent this in some other implementation (updating an employee a different way = a different AbstractValidator with the same rule). This shouldn't really be treated as business logic and instead a "time saver."
Example 2 has the disadvantage of a database call for existing entities but the advantage that no one can change managers without going through ChangeManager
where the logic is held.
I am striving for a mixture of 1 and 2 with heavy emphasis on 2. You can use the first to prevent database calls if that is a major concern for you or ignore it entirely and just focus on the second to prevent repeating yourself.
That's my $0.02 from a desktop implementation and not a web implementation.
from northwindtraders.
Hi Jason. Thank you very much for your sample. I like it very much!
You're welcome, sorry for the delay getting back to you.
I want to ask you about domain logic. What kind of logic should this layer contain?
Could it contain some business logic, e.g.?
Could you provide some clarifications, please.
Recommend to start by just adding logic to query and command handlers. When you find the need to duplicate logic, then push it out of the handler and down to the domain.
Thanks again and happy coding!
from northwindtraders.
Related Issues (20)
- Consistent naming for behaviors HOT 1
- Why is CQRS put in Application and not in WebUI? HOT 2
- Do non-entities core models belong to the domain? HOT 2
- Use ProblemDetails/ValidationProblemDetails etc for exception middleware
- Use ProblemDetails/ValidationProblemDetails etc for exception middleware? HOT 1
- How can we write unit test cases for controllers extending base controller as we are not using constructor injection. any leads will be appreciated. HOT 1
- What's the point of having the IDateTime interface? HOT 2
- FromSqlRaw won't work in Application HOT 2
- ValueObject.Equals bug when objects have a different number of values HOT 1
- [Question] Should JWT/RefreshToken creation be on infrastructure? HOT 1
- [Discussion] Clean Architecture - is it really? HOT 4
- Why does it not look like shown in the XAML ControlsGallery App - DataGrid HOT 4
- Dealing with duplication HOT 6
- Application layer access to DbContext? HOT 2
- A better way to do upsert HOT 1
- Suggestion: Request with record type
- something similar HOT 1
- IDbContext and repository pattern HOT 1
- How to call stored procedure for CURD operation? HOT 1
- This repo is pretty old and the projects don't event load in VS 2022 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from northwindtraders.