2014-04-11 24 views
5

Tôi đang sử dụng API Web v2 và tôi có một số mô hình mà tôi cần thực hiện các thao tác CRUD. Ví dụ, tôi có một mô hình Allergy và một mô hình Prescription. Trong bản thân ứng dụng, tôi có các mô hình có thể biến thành các mô hình thích hợp của chúng, nhưng vì mục đích đơn giản, hãy nói rằng tôi lấy mô hình thẳng trong bộ điều khiển Web API.Bộ điều khiển API Web chung

Vì vậy, một cái gì đó như thế này:

public class PrescriptionsController 
    { 
     public HttpResponseMessage Put(Prescription model) 
     { 
       // saved to the DB 
     } 

     ... (other CRUD operations) 
    } 

Tôi cũng có tương tự cho Allergy mô hình:

public class AllergiesController 
    { 
     public HttpResponseMessage Put(Allergy model) 
     { 
       // saved to the DB 
     } 

     ... (other CRUD operations) 
    } 

Cả hai mô hình có đặc tính khác nhau nhưng được xử lý một cách chính xác theo cùng một cách - trong thực tế, tôi có khoảng 3 mô hình khác được xử lý chính xác theo cùng một cách cho mỗi hoạt động CRUD. Tôi ghét phải có 5 điểm cuối khác nhau về cơ bản được sao chép và dán mã.

Vì vậy, câu hỏi của tôi là:

Tôi có thể tạo bộ điều khiển chung để xử lý tất cả các mô hình này không? Một cái gì đó như MyCommonController<T>? (nhưng với một tên tốt hơn của khóa học!) API Web có thể xử lý định tuyến trong kịch bản đó không? Đó có phải là một ý tưởng hay không?

+0

Tôi nghĩ bạn có thể đạt được điều này theo cách khác .. bằng cách định tuyến. Tôi chưa thử, nhưng sẽ thấy. – Guanxi

+0

Dường như có thể. Đây là cuộc thảo luận về vấn đề này: http://stackoverflow.com/questions/12077361/generic-webapi-controller – Trisk

Trả lời

7

Cuối cùng, tôi đã không thử một bộ điều khiển chung. Nó có vẻ như nó có thể có thể thông qua nhảy qua một số hoops với định tuyến.

Tuy nhiên, thực tế là các sửa đổi định tuyến để làm việc này phức tạp đến nỗi nó loại bỏ lợi ích mà tôi nhận được. Tôi muốn giữ mọi thứ đơn giản. Vì vậy, tôi vừa tạo ra một lớp cơ sở chung thay vì:

class MyBaseController<TModel> : ApiController 
{ 
    public TModel Get(int id) { ... } 
} 

và đã từng loại kế thừa từ nó:

class PrescriptionsController : MyBaseController<Prescription> { } 

Và đó làm việc như quyến rũ, không phải gây rối với định tuyến hoặc bất cứ điều gì. Nó làm cho nó rõ ràng những gì đang xảy ra và là khá duy trì.

Các vấn đề liên quan