CRUD With Minimal Api

CRUD Operations

נשלים את שאר הפעולות שהיו ב-controller עם Minimal API.

יש לנו הבאת מוצר אחד ואת רשימת המוצרים:

app.MapGet("products", async Task<Ok<List<Product>>> 
  (IProductsRepository repo) => {
    var result = await repo.GetAllProducts();
    return TypedResults.Ok(result);
});

app.MapGet("products/{id}", async Task<Results<NotFound, Ok<Product>>> 
  (int id, IProductsRepository repo) => {
    var result = await repo.GetProductById(id);
    if (result == null) {
        return TypedResults.NotFound();
    }
    return TypedResults.Ok(result);
});

פעולת Delete.

app.MapDelete("products/{id}", async Task<Results<NotFound, Ok<Product>>> 
    (int id, IProductsRepository repo) => {
        var result = await repo.GetProductById(id);
        if (result == null) {
            return TypedResults.NotFound();
        }
        await repo.DeleteProduct(id);
        return TypedResults.Ok(result);
});

פעולת עדכון.

app.MapPut("products/{id}", async Task<Results<NotFound, Ok<Product>>> 
    (int id, Product product, IProductsRepository repo) => {
        var result = await repo.GetProductById(id);
        if (result == null) {
            return TypedResults.NotFound();
        }
        var productAfterUpdate = await repo.UpdateProduct(id, product);
        return TypedResults.Ok(productAfterUpdate);
});

פעולת הוספה.

app.MapPost("products/", async Task<Created<Product>> 
  (Product product, IProductsRepository repo) => {
    Product addProduct = await repo.AddNewProduct(product);
    return TypedResults.Created($"api/products/{addProduct.id}", addProduct);
});

Use Tags

בדרך הכתיבה של Minimal API אנחנו מאבדים את החלוקה שהיתה לנו קודם על ידי ה-controllers. את זה משיגים ע"י WithTags.

app.MapGet("time", () => DateTime.Now).WithTags("Time");
app.MapGet("time/{id}", (int id) => $"The value id {id}").WithTags("Test");
app.MapGet("time/{name}/{id}", (string name, int id, string? description) => 
    $"The value {id} {description} {name}").WithTags("Test");

app.MapGet("products", async Task<Ok<List<Product>>> (IProductsRepository repo) => {
    var result = await repo.GetAllProducts();
    return TypedResults.Ok(result);
}).WithTags("Products");

הבעיה היא שאם יש לי 20 פונקציות, אני חוזרת על הקוד הזה בכל ה-20.

MapGroup

יש לנו 2 חזרות על קוד.

  1. בכל url יש את התחילית של products בפעולות מול ה-DB.
  2. לכל פעולה חוזרים על WithTags של products.

זה אומר שאם נצטרך לשנות משהו, נצטרך לעבור על הכל. בשביל זה יש לנו את MapGroup. ניצור משתנה productsGroup שבו נשים את ההגדרות של ה-url וה-tags. ונפעיל את הפעולות דרך ה-MapGroup.

var productGroup = app.MapGroup("products").WithTags("Products");

productGroup.MapGet("", async Task<Ok<List<Product>>> (IProductsRepository repo) => {
    var result = await repo.GetAllProducts();
    return TypedResults.Ok(result);
});

את אותה הפעולה נבצע בכל פעולות CRUD. נפעיל אותם דרך productGroup ונוריד את WithTags ואת החלק של products ב-URL.

על ה-Group הזה יהיה אפשר להפעיל עוד פעולות, הרבה דברים שהגדרנו עד עכשיו דרך ה-controller.

הדבר האחרון שנשאר לסדר, זה להוציא את כל ההגדרות האלה לקובץ נפרד שלא ישבו בתוך ה-program.

ניווט במאמר

מאמרים אחרונים

Weekly Tutorial