Intent.Modelers.Domain.Repositories
The Repository Pattern is a common design pattern in software development that encapsulates data access logic, providing a clean separation between domain/business logic and data persistence.
Repositories act as intermediaries between the application and data sources (e.g., relational databases or document stores). They abstract query operations and centralize data access logic, resulting in:
- Improved testability
- Enhanced maintainability
- Greater flexibility to change data strategies without impacting business logic
The Intent.Modelers.Domain.Repositories
module enables you to model repositories within Intent Architect. These repositories are then realized differently based on:
- The selected Domain Database Type:
- Relational
- Document
- The installed Module:
- e.g. Entity Framework, CosmosDB
Modeling an Entity Repository
By default, a Repository
is generated for each qualifying domain entity, including standard CRUD operations. You can extend this repository with custom operations and functionality.
How to Extend a Repository
- In the Domain Designer, right-click the entity you want to extend.
- Select
Model Repository
.
This creates a repository specific to that entity, where you can define additional operations. These operations will be generated in code alongside the standard CRUD methods.
Example Generated Repository
[IntentManaged(Mode.Merge, Signature = Mode.Fully)]
public class CustomerRepository : RepositoryBase<Customer, Customer, ApplicationDbContext>, ICustomerRepository
{
public CustomerRepository(ApplicationDbContext dbContext, IMapper mapper) : base(dbContext, mapper)
{
}
[IntentManaged(Mode.Fully, Body = Mode.Ignore)]
public int GetCustomerCount()
{
// TODO: Implement GetCustomerCount (CustomerRepository) functionality
throw new NotImplementedException("Your implementation here...");
}
public async Task<TProjection?> FindByIdProjectToAsync<TProjection>(
Guid id,
CancellationToken cancellationToken = default)
{
return await FindProjectToAsync<TProjection>(x => x.Id == id, cancellationToken);
}
// other methods
}
Notes:
- Custom methods are marked with
[IntentManaged(..., Body = Mode.Ignore)]
so that their logic is not overwritten during code generation. - You must implement the logic manually to match your specific use case.
Complex Parameter Entities
If complex objects need to be passed to or returned from a repository operation, a Data Contract or Value Object should be used.
- Learn how to create a Domain Contract
- Learn more about Value Objects
Once defined, a Domain Contract can be used as a parameter or return type in a repository operation: