2013-08-21 38 views
7

Tôi đang đánh giá cách thêm liên kết hypermedia vào phản hồi DTO. Mặc dù không có tiêu chuẩn, hãy thêm Danh sách vào DTO phản hồi có vẻ là suggested approach.Liên kết Hypermedia với API mới Servicestack

Bạn có biết bất kỳ ví dụ hoặc tham chiếu nào về triển khai bằng cách sử dụng khung ServiceStack không?

Thêm danh sách là ok đối với tôi, nhưng nghi ngờ của tôi là về vị trí đặt logic của các liên kết sau (Trong dịch vụ hoặc lớp chuyên biệt chứa máy trạng thái?) Và nơi để giải quyết tuyến đường (Bộ lọc?)

Cảm ơn.

[Update] Từ ServiceStack phiên bản v3.9.62 nó là posible để truy cập cấu hình tuyến đường thông qua EndpointHost.Config.Metadata.Routes.RestPath, do đó, giải pháp được cung cấp bởi tgmdbm có thể được cải thiện withouth sự cần thiết của "IReturn + tuyến tính thuộc tính" , chỉ cần sử dụng thông tin Metadata.Routes. Trong thực tế, tất cả các siêu dữ liệu dịch vụ có thể được truy vấn và sử dụng để cắt ngang các mối quan tâm. Đá Servicestack.

Trả lời

9

Con đường tôi làm điều này hiện nay là tôi vượt qua trở lại một phản ứng dto mà thực hiện một giao diện

Sau đó, tôi sử dụng một bộ lọc phản ứng để tạo ra các url và cư trú trong tiêu đề phản ứng với các liên kết.

this.ResponseFilters.Add((req, res, dto) => 
{ 
    if (!(dto is IHaveLinks)) 
    return; 

    var links = (dto as IHaveLinks).Links 

    if(links == null || !links.Any()) 
    return; 

    var linksText = links 
    .Select(x => string.Format("<{0}>; rel={1}"), x.Request.ToUrl(x.Method), x.Name)); 

    var linkHeader = string.Join(", ", linksText); 

    res.AddHeader("Link", linkHeader); 
}); 

Đây có vẻ là cách sạch nhất. Đối tượng Link ở trên có hiệu quả nói "Nếu bạn thực hiện yêu cầu này bằng phương pháp này, bạn sẽ lấy lại tài nguyên được đặt tên". Điều HTTP duy nhất chảy máu đến BLL là Method. Nhưng bạn có thể thoát khỏi điều đó và chỉ trả lại GET url. Hoặc lập bản đồ cho một số "hoạt động" tổng quát?

Như một ví dụ:

public class ExampleService : Service 
{ 
    public ExamplesResponse Get(ExamplesRequest request) 
    { 
    var page = request.Page; 
    var data = // get data; 

    return new ExamplesResponse 
     { 
     Examples = data, 
     Links = new [] 
      { 
      new Link { Name = "next", Request = request.AddPage(1), Method = "GET" }, 
      new Link { Name = "previous", Request = request.AddPage(-1), Method = "GET" }, 
      } 
     } 
    } 
} 

[Route("/examples/{Page}")] 
public class ExamplesRequest : IReturn<ExamplesResponse> 
{ 
    public int Page { get; set; } 

    // ... 
} 

(Phương pháp AddPage trả về một bản sao của các yêu cầu và đặt trang tài sản một cách thích hợp.)

Hy vọng rằng sẽ giúp.

+0

Cảm ơn bạn, đây là giải pháp tốt phù hợp với khung công tác Servicestack. Liên quan đến BLL, tôi nghĩ vấn đề nằm trong chính khuôn khổ đó. Chỉ cần nếu nó có quyền truy cập mở rộng hơn vào các tuyến đường thì sẽ dễ dàng hơn khi sử dụng Bản đồ đó để thực hiện định tuyến ngược và có thể tránh tất cả các mã cơ sở hạ tầng đó (thuộc tính IReturn + Route) – jruizaranguren

+0

Vâng, phương pháp 'ToUrl' là nơi ma thuật xảy ra và, thật không may, nó đòi hỏi yêu cầu dto để triển khai IReturn và có thuộc tính Route. – tgmdbm