trening
├── Controllers
│ └── BooksController.cs
├── Data
│ └── AppDbContext.cs
├── Dtos
│ ├── BookDto.cs
│ ├── CreateBookDto.cs
│ └── UpdateBookDto.cs
├── Managers
│ └── BookManager.cs
├── Models
│ └── Book.cs
├── Repositories
│ ├── IBookRepository.cs
│ └── BookRepository.cs
├── Program.cs
└── appsettings.json
Models/Book.cs
csharp
Копіювати код
namespace trening.Models
{
public class Book
{
public int Id { get; set; }
public string Title { get; set; }
public string Author { get; set; }
}
}
Dtos/BookDto.cs
csharp
Копіювати код
namespace trening.Dtos
{
public class BookDto
{
public int Id { get; set; }
public string Title { get; set; }
public string Author { get; set; }
}
}
Dtos/CreateBookDto.cs
csharp
Копіювати код
namespace trening.Dtos
{
public class CreateBookDto
{
public string Title { get; set; }
public string Author { get; set; }
}
}
Dtos/UpdateBookDto.cs
csharp
Копіювати код
namespace trening.Dtos
{
public class UpdateBookDto
{
public string Title { get; set; }
public string Author { get; set; }
}
}
Data/AppDbContext.cs
csharp
Копіювати код
using Microsoft.EntityFrameworkCore;
using trening.Models;
namespace trening.Data
{
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options)
: base(options)
{
}
public DbSet<Book> Books { get; set; }
}
}
Repositories/IBookRepository.cs
csharp
Копіювати код
using trening.Models;
namespace trening.Repositories
{
public interface IBookRepository
{
List<Book> GetAll();
Book? FindById(int id);
Book Create(Book book);
void Update(Book book);
void Delete(Book book);
}
}
Repositories/BookRepository.cs
csharp
Копіювати код
using Microsoft.EntityFrameworkCore;
using trening.Data;
using trening.Models;
namespace trening.Repositories
{
public class BookRepository : IBookRepository
{
private readonly AppDbContext dbContext;
public BookRepository(AppDbContext dbContext)
{
this.dbContext = dbContext;
}
public List<Book> GetAll()
{
return this.dbContext.Books.ToList();
}
public Book? FindById(int id)
{
return this.dbContext.Books.FirstOrDefault(book => book.Id == id);
}
public Book Create(Book book)
{
this.dbContext.Books.Add(book);
this.dbContext.SaveChanges();
return book;
}
public void Update(Book book)
{
this.dbContext.SaveChanges();
}
public void Delete(Book book)
{
this.dbContext.Books.Remove(book);
this.dbContext.SaveChanges();
}
}
}
Managers/BookManager.cs ✅ (тут if + mapping)
csharp
Копіювати код
using trening.Dtos;
using trening.Models;
using trening.Repositories;
namespace trening.Managers
{
public class BookManager
{
private readonly IBookRepository bookRepository;
public BookManager(IBookRepository bookRepository)
{
this.bookRepository = bookRepository;
}
public List<BookDto> getAll()
{
List<Book> books = this.bookRepository.GetAll();
List<BookDto> bookDtos = new List<BookDto>();
foreach (Book book in books)
{
BookDto bookDto = new BookDto();
bookDto.Id = book.Id;
bookDto.Title = book.Title;
bookDto.Author = book.Author;
bookDtos.Add(bookDto);
}
return bookDtos;
}
public BookDto? findById(int id)
{
Book? book = this.bookRepository.FindById(id);
if (book == null)
return null;
BookDto bookDto = new BookDto();
bookDto.Id = book.Id;
bookDto.Title = book.Title;
bookDto.Author = book.Author;
return bookDto;
}
public BookDto createBook(CreateBookDto dto)
{
Book createdBook = new Book();
createdBook.Title = dto.Title;
createdBook.Author = dto.Author;
createdBook = this.bookRepository.Create(createdBook);
BookDto createdBookDto = new BookDto();
createdBookDto.Id = createdBook.Id;
createdBookDto.Title = createdBook.Title;
createdBookDto.Author = createdBook.Author;
return createdBookDto;
}
public BookDto? updateBook(int id, UpdateBookDto dto)
{
Book? book = this.bookRepository.FindById(id);
if (book == null)
return null;
book.Title = dto.Title;
book.Author = dto.Author;
this.bookRepository.Update(book);
BookDto updatedBookDto = new BookDto();
updatedBookDto.Id = book.Id;
updatedBookDto.Title = book.Title;
updatedBookDto.Author = book.Author;
return updatedBookDto;
}
public bool deleteBook(int id)
{
Book? book = this.bookRepository.FindById(id);
if (book == null)
return false;
this.bookRepository.Delete(book);
return true;
}
}
}
Controllers/BooksController.cs ✅ (тонкий)
csharp
Копіювати код
using Microsoft.AspNetCore.Mvc;
using trening.Dtos;
using trening.Managers;
namespace trening.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class BooksController : ControllerBase
{
private readonly BookManager bookManager;
public BooksController(BookManager bookManager)
{
this.bookManager = bookManager;
}
[HttpGet]
public ActionResult<List<BookDto>> GetAll()
{
List<BookDto> books = this.bookManager.getAll();
return Ok(books);
}
[HttpGet("{id}")]
public ActionResult<BookDto> GetById(int id)
{
BookDto? book = this.bookManager.findById(id);
if (book == null)
return NotFound();
return Ok(book);
}
[HttpPost]
public ActionResult<BookDto> Create(CreateBookDto dto)
{
BookDto createdBook = this.bookManager.createBook(dto);
return CreatedAtAction(
nameof(GetById),
new { id = createdBook.Id },
createdBook
);
}
[HttpPut("{id}")]
public ActionResult<BookDto> Update(int id, UpdateBookDto dto)
{
BookDto? updatedBook = this.bookManager.updateBook(id, dto);
if (updatedBook == null)
return NotFound();
return Ok(updatedBook);
}
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
bool deleted = this.bookManager.deleteBook(id);
if (!deleted)
return NotFound();
return NoContent();
}
}
}
Program.cs
csharp
Копіювати код
using Microsoft.EntityFrameworkCore;
using trening.Data;
using trening.Managers;
using trening.Repositories;
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
builder.Services.AddScoped<IBookRepository, BookRepository>();
builder.Services.AddScoped<BookManager>();
WebApplication app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.MapControllers();
app.Run();
appsettings.json (приклад)
json
Копіювати код
{
"ConnectionStrings": {
"DefaultConnection": "Server=.;Database=TreningDb;Trusted_Connection=True;TrustServerCertificate=True"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}