1 Câu hỏi: Có thể gọi phương thức hành động (từ phương thức hành động) và để cho param.Net Core [FromQuery] nhập thông số?

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi có tuyến /my/route?t=something&... được xử lý bằng phương thức hành động, sau đó chuyển sang t và gọi một chương trình con thích hợp để làm bất cứ điều gì cần làm. Ví dụ:

[HttpGet("my/route")]
public IActionResult GetStuff([FromQuery(Name = "t")]string searchType)
{
    switch (searchType)
    {
        case "type1":
            return getStuff_type1();
        case "type2":
            return getStuff_type2();
        default:
            return BadRequest();
    }
}

Tuy nhiên, mỗi chương trình con mong đợi các thông số truy vấn khác (một số /nhiều trong số đó có thể khác nhau tùy thuộc vào nhu cầu của chương trình con).

Vì vậy, "type1" có thể chấp nhận tham số truy vấn "a", "b", "c", "d"; và "type2" có thể chấp nhận các tham số truy vấn "v", "w", "x", "y", "z".

Rõ ràng là tôi có thể kéo tất cả các thông số (abcdvwxyz và hơn thế nữa cho các loại khác) vào phương thức hành động chính GetStuff và chuyển chúng vào chương trình con một cách phù hợp, nhưng điều này sẽ rất hay nếu tôi có thể gọi các chương trình con và chỉ cần để chúng chỉ định các tham số truy vấn mong muốn của chúng để GetStuff chính sẽ không phải quan tâm (điều này có thể cần phải sử dụng một số chức năng của Io.Net Core IoC để cho phép các thông số [FromQuery] của chương trình con được thực hiện). >

Một tùy chọn khác sẽ là cho các chương trình con chỉ cần sử dụng Request.Query để lấy tham số mong muốn của chúng, nhưng điều này không khai báo /ghi lại các giá trị đầu vào cho thường trình - không tốt cho việc kiểm tra hoặc làm rõ mã. >

Câu hỏi là, ASP.Net Core có chức năng cho phép chuyển yêu cầu sang phương thức hành động cụ thể, cụ thể khác không (và thực hiện bất kỳ lệnh tiêm phụ thuộc cần thiết nào)?

    
0
1 Câu trả lời                              1                         

Đơn giản là không. Tuy nhiên, tất cả các thông số hành động là tùy chọn (chúng sẽ chứa đầy mặc định, nếu không được cung cấp), vì vậy phương pháp được đề xuất là chỉ chấp nhận tất cả các thông số có lẽ là lựa chọn tốt nhất của bạn. Nếu điều đó không được chấp nhận, bạn có thể dự phòng lấy chúng theo cách thủ công từ Request.Query, nhưng bạn sẽ cần phải xác thực /ràng buộc của riêng mình với điều đó (tất cả chúng sẽ chỉ là chuỗi ở đó).

Điều đó nói rằng, dựa trên mô tả vấn đề của bạn, cách tốt nhất của bạn là thực sự sử dụng các tuyến riêng biệt. Về cơ bản, bạn đang chiến đấu một chút với cách ánh xạ tài nguyên yêu cầu được cho là hoạt động với HTTP. Nếu bạn có các loại tìm kiếm khác nhau, mỗi loại yêu cầu các thông số khác nhau, thì chúng có thể được coi là mỗi tài nguyên duy nhất. Mỗi người đang làm một cái gì đó khác nhau và yêu cầu đầu vào khác nhau. Hãy xem xét một ví dụ cấp thấp hơn, nơi bạn đang thực hiện tất cả điều này trực tiếp trên một mô hình miền, không có lớp HTTP. Làm thế nào chính xác bạn sẽ xử lý logic? Bạn sẽ chỉ có một phương pháp để xử lý tất cả các loại tìm kiếm có thể? Chắc là không. Ngay cả khi bạn đã làm, làm thế nào bạn sẽ cung cấp params trong trường hợp đó? Bạn vẫn không cần phải cho phép tất cả các thông số có thể được cung cấp chứ?

Dài và ngắn, tôi sẽ xóa hành động proxy này và hiển thị từng phương thức loại tìm kiếm riêng lẻ dưới dạng một hành động. Loại tìm kiếm có thể là một tham số tuyến. Sau đó, nếu bạn thực sự muốn, bạn vẫn có thể có một hành động proxy chỉ cần lấy loại tìm kiếm từ truy vấn và chuyển hướng đến tuyến loại tìm kiếm phù hợp, cùng với phần còn lại của truy vấn.     

1
2019-05-08 15: 58: 50Z
  1. Yup, tôi đồng ý có các tuyến duy nhất là đẹp hơn .. đó là (và vẫn là) lựa chọn đầu tiên của tôi. Tôi đã chơi xung quanh với nhiều cách làm việc khác nhau (trong khi tìm ra thiết kế tuyến đường API của mình) và tò mò liệu chức năng trong câu hỏi có khả thi không. Cảm ơn câu trả lời và khuyến khích giữ các tuyến riêng biệt (mặc dù tôi chưa hoàn toàn chắc chắn về lược đồ tuyến của mình .. nhưng đó là một câu hỏi khác).
    2019-05-08 19: 14: 52Z
nguồn đặt đây