Chúng tôi chỉ đang bắt đầu thực hiện một nỗ lực phối hợp để sử dụng tiêm phụ thuộc thống nhất trong dự án của chúng tôi và tôi đã gặp phải vấn đề.PHP Dependency injection khi các đối số cho hàm tạo không có sẵn
Tôi đang viết một lớp để xử lý các truy vấn MongoDB của mình. Tôi vượt qua trong MongoClient như là một phụ thuộc vào các nhà xây dựng, không có vấn đề. Nhưng làm thế nào để xử lý một phụ thuộc khi biến cần thiết để khởi tạo đối tượng là không có sẵn tại thời điểm instantiation?
Cụ thể, chúng tôi có trình bao bọc cho phương thức MongoCollection, findOne, nếu bạn chuyển một chuỗi vào, hiện tại (trong mã cũ) biến chuỗi đó thành MongoId bằng "MongoId mới ($ _ id)", và sử dụng nó cho hàm find. Từ những gì tôi đã học về tiêm phụ thuộc, có "MongoId mới" là một ý tưởng tồi, và tôi biết rằng nó sẽ làm cho nó khó khăn hơn để viết các trường hợp thử nghiệm cho hàm chuyển đổi một chuỗi thành MongoId.
Nhưng làm cách nào để xử lý việc tiêm, khi lớp MongoId nhận chuỗi id trên hàm tạo?
Điều duy nhất tôi đã nghĩ về điều đó sẽ làm việc là để vượt qua trong một đóng cửa vào constructor lớp đó làm điều gì đó như:
$getMongoId = function($id){
return new MongoId($id);
};
với
class MyMongo
{
function __construct(MongoClient $client, Closure $mongoIdGetter){...}
}
[chỉnh sửa để sửa lỗi này phần cuối cùng]
Nhưng đây có phải là cách phù hợp để xử lý không? Tất nhiên, nếu chúng ta đang sử dụng một DiC, chúng ta có thể làm điều đó, nhưng đòi hỏi một đóng cửa cho constructor có vẻ hơi nhiều. Tôi chỉ là quá giáo điều về việc tiêm phụ thuộc của tôi? Tôi có thể sửa lỗi này một cách dễ dàng bằng cách sử dụng "MongoId mới ($ _ id)" trong lớp mới, tôi cho là vậy.
Cảm ơn - cấu trúc $ __ chỉ là một rắm não, được sửa ở trên. Tôi nghĩ rằng bạn một phần đọc sai câu hỏi của tôi bởi vì khi tôi nói "xử lý" ở trên, tôi không đề cập đến xử lý lỗi, chỉ là ý nghĩa chung của từ đó. – Karptonite
@Karptonite Oh ok, vậy bạn có thể làm rõ tại sao bạn muốn đặt bộ cài MongoId vào trong cấu trúc, tôi hiểu sự phụ thuộc nhưng nó sẽ không cần thiết cho đến khi bạn thực sự sử dụng hàm 'find'. Ý tôi là để kiểm tra đơn vị tất cả những gì bạn cần là kiểm tra phản hồi của chức năng công cộng của bạn rằng nó trả về một tài liệu cần tồn tại trong khi nhập một chuỗi cho '_id', bạn không nên mở rộng thử nghiệm đơn vị của mình tới trình điều khiển MongoDB – Sammaye
Tôi mới dùng tiêm phụ thuộc - nhưng sự hiểu biết của tôi là sử dụng một hàm như bạn đã viết, với "MongoId mới" ngay trong mã, thường là một ý tưởng tồi - ví dụ, nếu tôi sử dụng bất kỳ phương thức nào của MongoId trong mã, tôi không thể giả lập nó để đảm bảo rằng mã của tôi được gọi là các phương thức đó đúng cách. Phải thừa nhận rằng, đó không phải là điều tôi đang làm bây giờ. – Karptonite