Ai nên khởi tạo phụ thuộc trong ứng dụng TDD?


8

Tôi đang cố gắng học cách thực hiện TDD với các đối tượng giả / giả. Một trong những câu hỏi tôi có là làm thế nào để khởi tạo một phụ thuộc trong một ứng dụng thực hiện TDD? Một ví dụ từ bài viết này Bắt đầu Mocking With Moq 3 cho thấy:

public class OrderWriter
{
    private readonly IFileWriter fileWriter;

    public OrderWriter(IFileWriter fileWriter)
    {
        this.fileWriter = fileWriter;
    }

    public void WriteOrder(Order order)
    {
        fileWriter.WriteLine(String.Format("{0},{1}", order.OrderId, order.OrderTotal));
    }
}

Trong ví dụ này, hàm tạo lấy một IFileWritertham số, tôi cho rằng vì bạn muốn cung cấp trình ghi tệp thực trong trường hợp ứng dụng thực tế và giả mạo để kiểm tra đơn vị. Câu hỏi của tôi là, trong ứng dụng thực, ai sẽ cung cấp thông số này? Tôi cho rằng nó sẽ là người gọi của ứng dụng này. Điều gì nếu nó có sự phụ thuộc cũng như trong các nhà xây dựng? Mã người gọi cũng sẽ chịu trách nhiệm cho điều đó?

Có lẽ cách tốt hơn là sử dụng nhà máy. Nhà máy này sẽ hoạt động như thế nào? Và nhà máy sẽ được phân phối như thế nào? Nó sẽ nằm trong tham số constructor như cách trên?

Câu trả lời:


7

Thứ bạn đang tìm kiếm là một bộ chứa IoC để tự động kích hoạt tất cả các đối tượng của bạn khi khởi động ứng dụng. Hãy xem Ninject , nó có một ví dụ rất đơn giản trên trang nhất. (Đây cũng là một sản phẩm tốt và ... tốt, ninja!)

Theo nguyên tắc chung, bạn nên cố gắng giải quyết tất cả các đối tượng cấp cao nhất của mình (ví dụ: Trang trong ASP.NET, Trình điều khiển trong MVC cho ASP.NET, Biểu mẫu trong Winforms) trực tiếp từ bộ chứa IoC và để nó nối dây TẤT CẢ phụ thuộc thông qua tiêm xây dựng. Sẽ có lúc bạn phải buộc nó giải quyết một mục cấp thấp hơn - điều này được gọi là sử dụng nó như một Trình định vị dịch vụ - nhưng điều này thường nên tránh vì chúng khó (nhưng không phải là không thể) để kiểm tra và tạo một API có thể gây nhầm lẫn cho người tiêu dùng, nếu đó không phải là bạn.

ASP.NET cho MVC, từ phiên bản 3, được thiết kế đặc biệt để loại bỏ bộ chứa IoC khỏi phần còn lại của mã trong khi cho phép bạn tự động tiêm vào bất kỳ lớp cấp cao nhất nào (Bộ điều khiển, Chế độ xem, Bộ lọc, v.v.) thông qua DependencyResolver lớp . Các khung .NET khác cần nỗ lực hơn một chút, nhưng có thể nếu bạn có Google.

Có một cuốn sách về chủ đề được gọi là Dependency Injection in .NET . Tôi đã không đọc nó cá nhân, nhưng tôi đã nghe những điều tốt.


0

Tôi đã thấy cách tiếp cận của việc thêm một hàm tạo mặc định gọi hàm tạo được tham số hóa với các thể hiện mặc định, tức là "tiêm phụ thuộc của người nghèo".

public OrderWriter()
    : this(new TextFileWriter())
{
}

Đường dẫn mã thông thường gọi hàm tạo mặc định, trong khi kiểm tra đơn vị khởi tạo bằng cách sử dụng hàm tạo tùy chỉnh.

Nếu bất cứ ai có thể giải thích những ưu và nhược điểm của phương pháp này, tôi sẽ đánh giá cao nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.