2012-02-07 22 views
5

Tôi đang làm việc với Braintree API for .NET để xử lý các khoản thanh toán xử lý. Doanh nghiệp của họ thực hiện tốt công việc xử lý thanh toán và trình bao bọc API hoạt động để sử dụng đơn giản. Tuy nhiên, trình bao bọc API được cung cấp bắt đầu thất bại nhanh chóng khi điều tra gần hơn hoặc sử dụng vất vả hơn; ví dụ: nó chứa các số được cuộn bằng tay enum s. Vấn đề của tôi đi kèm với đơn vị kiểm tra mã của tôi sử dụng trình bao bọc này. Để làm được điều này, về cơ bản tôi cần giả lập cổng Braintree giả mạo của riêng tôi sẽ có một số giá trị đã biết trong đó, tạo ra lỗi khi được yêu cầu, vv Kế hoạch tấn công của tôi là ghi đè lên chức năng của Trình bao bọc API Braintree và định tuyến lại các yêu cầu đến điểm cuối trong bộ nhớ cục bộ. Sau đó, tôi có thể sử dụng tiêm phụ thuộc để liên kết các cổng/wrapper thích hợp khi chạy.API Braintree không thể tin được: Tôi có nên thay đổi mã nguồn hoặc gói riêng từng lớp không?

Ban đầu, nó dường như đang bơi: bất chấp các lỗi chống lại kỹ thuật phần mềm đã được cam kết trong trình bao bọc API, mọi phương pháp mà tôi cần ghi đè được đánh dấu một cách kỳ diệu virtual. Tuy nhiên, điều đó đã dừng lại một cách rít rợn: gần như hàm tạo trong trình bao bọc API được đánh dấu internal. Như vậy, tôi không thể kế thừa các lớp này và cũng không tạo ra chúng vào lúc nào để lưu trữ để thử nghiệm.

Một bên: Tôi grok internal nhà thầu và lý do khiến người khác muốn sử dụng chúng một cách hợp pháp. Tuy nhiên, tôi đã xem xét mã nguồn cho điều này, và mọi constructor internal chỉ thực hiện các nhiệm vụ thuộc tính tầm thường. Như vậy, tôi cảm thấy thoải mái khi tuyên bố rằng một thực hành mã hóa khác nhau nên được tuân theo.

Vì vậy, tôi về cơ bản trái với ba lựa chọn:

  1. Viết wrapper API của riêng mình từ đầu. Điều này rõ ràng là có thể thực hiện được, và giữ lợi thế là nó sẽ mang lại một cơ sở hạ tầng được thiết kế tốt. Những bất lợi, tuy nhiên, quá nhiều để liệt kê một thời gian ngắn.

  2. Kéo mã nguồn từ API xuống và đưa mã nguồn vào giải pháp. Tôi có thể thay đổi tất cả các nhà xây dựng internal để trở thành bất cứ điều gì tôi cần để họ làm việc. Điểm bất lợi là tôi sẽ phải cập nhật lại tất cả các thay đổi này sau mỗi lần phát hành trình bao bọc API tiếp theo.

  3. Viết các lớp trình bao bọc cho từng đối tượng đơn lẻ mà tôi cần sử dụng trong toàn bộ trình bao bọc API. Điều này giữ lợi thế của việc không thay đổi mã nguồn được cung cấp; những nhược điểm là lớn, mặc dù: về cơ bản viết lại tất cả các lớp trong wrapper ba lần (một giao diện, một bộ điều hợp wrapper API Braintree, và một phiên bản thử nghiệm).

Thật không may, tất cả những thứ đó đều bị hút. Tôi cảm thấy như lựa chọn 2 có thể là ít nhất là xấu của các tùy chọn, nhưng nó làm cho tôi cảm thấy bẩn. Có ai giải quyết vấn đề này đã/viết một wrapper tốt hơn, testable hơn? Nếu không, tôi đã bỏ lỡ một hành động có thể có? Nếu không, lựa chọn nào trong số ba tùy chọn đó có vẻ ít phiền toái nhất?

Trả lời

1

Vì bạn đang không kiểm tra API của họ, tôi sẽ sử dụng một mô hình Facade.Bạn không cần phải bọc mọi thứ chúng cung cấp, chỉ cần gói gọn chức năng bạn đang sử dụng. Điều này cũng mang lại cho bạn một lợi thế: Nếu bạn quyết định bỏ qua API đó trong tương lai, bạn chỉ cần triển khai lại trình bao bọc của mình.

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