---
title: Separate Data Access Logic
impact: HIGH
impactDescription: improves testability and maintainability
tags: architecture, repository, layering, quality, csharp
---

## Separate Data Access Logic

Keep database logic out of Controllers and Business Services. Use Repositories or Query handlers.

**Incorrect (DB usage in controller):**

```csharp
[HttpPost]
public IActionResult CreateUser(User user)
{
    // Direct EF context usage in controller
    using (var context = new DbContext())
    {
        context.Users.Add(user);
        context.SaveChanges();
    }
    return Ok();
}
```

**Correct (Repository/Service pattern):**

```csharp
// Controller
public IActionResult CreateUser(UserDto dto)
{
    _userService.RegisterUser(dto);
    return Ok();
}

// Service
public void RegisterUser(UserDto dto)
{
    var user = _mapper.Map<User>(dto);
    _userRepository.Add(user);
}

// Repository
public void Add(User user)
{
    _context.Users.Add(user);
    _context.SaveChanges();
}
```

**Tools:** Architecture Tests, SonarQube
