Như Darin đã chỉ ra, ASP.NET MVC 4 là một Framework và là bất khả tri của container. Đó là lý do tại sao nó cung cấp một định vị dịch vụ theo hình thức IDependencyResolver
. Điều này cho phép bất cứ ai để cắm vào container của họ lựa chọn.
Tuy nhiên, tôi sẽ không gọi đây là mẫu chống. Điều này cho phép bạn sử dụng vùng chứa mà bạn chọn, nhưng không buộc bạn nhà phát triển ứng dụng sử dụng vị trí dịch vụ. Nếu khung công tác buộc nhà phát triển sử dụng Vị trí dịch vụ, thì tôi sẽ gọi nó là một mẫu chống. Nhưng nhà phát triển đã xây dựng một ứng dụng ASP.NET MVC là miễn phí để sử dụng DI thông qua việc xây dựng tiêm, thiết lập thuộc tính hoặc vị trí dịch vụ. Đó là sự lựa chọn của họ.
Hãy xem tất cả các ví dụ về ASP.NET MVC về tiêm phụ thuộc được xuất bản bởi tôi hoặc nhóm ASP.NET MVC. Trong khá nhiều trường hợp, họ đang sử dụng phương thức khởi tạo. Họ không sử dụng vị trí dịch vụ.
Thực tế, phần lớn mã nguồn ASP.NET MVC không sử dụng vị trí dịch vụ để truy xuất các phụ thuộc. Có một vài địa điểm chính mà MVC gọi vào bộ định vị dịch vụ cho các API cũ và như vậy. Nhưng đó là về nó.
Khung +1 tuân theo các quy tắc khác với các ứng dụng.Bạn muốn giữ một không gian khuôn khổ bất khả tri (trong trường hợp ứng dụng muốn sử dụng khung công tác đã sử dụng một vùng chứa khác) và bạn thường không muốn thực thi việc sử dụng DI trên các ứng dụng đó (vì chúng có thể không muốn sử dụng DI ở tất cả). –
Tôi không mua lập luận rằng chỉ vì nó là một khuôn khổ, một Service Locator là thích hợp. Vâng, các khung công tác khác với các ứng dụng, nhưng hoàn toàn có thể viết một khung công tác mà không cần sử dụng một Service Locator. Chỉ cần nhìn vào ASP.NET MVC 1 và 2, hoặc thậm chí một cái gì đó phức tạp như WCF. Vấn đề với DependencyResolver trong ASP.NET MVC 3+ là nó không chỉ là một chi tiết thực hiện nội bộ, mà đúng hơn là được xuất bản và chào hàng như là 'DI support' công khai. –
@MarkSeemann Tôi đã thảo luận với kiến trúc sư trưởng của một khuôn khổ doanh nghiệp lớn. Nếu bạn có thể cho tôi biết làm thế nào để tạo ra một khung công tác không xác định như vậy và không thực thi mẫu DI trên tất cả các ứng dụng được viết bằng khung đó, tôi sẽ rất vui khi nghe chúng. –