46

Sau khi đọc "Dependency Injection in .NET" bởi Mark Seemann Tôi tránh xa số Service Locator là một mẫu chống.Tại sao MVC4 lại sử dụng Service Anti-Pattern Locator?

Khi đọc the release notes on MVC 4 tôi thấy:

Cải thiện Inversion of Control (IoC) thông qua DependencyResolver: Web API bây giờ sử dụng mô hình dịch vụ định vị được thực hiện bởi sự phụ thuộc resolver MVC để có được các trường hợp cho nhiều cơ sở khác nhau.

Như vậy tôi là trái tò mò và bối rối vì sao Microsoft sẽ sử dụng một dịch vụ định vị vào năm 2012.

Trả lời

50

Đó là một chi tiết thực hiện mà bạn không nên quan tâm. Điều quan trọng là bây giờ Web API sử dụng DependencyResolver để giải quyết các phụ thuộc cho nhiều cơ sở khác nhau, bạn sẽ có thể sử dụng một tiêm phụ thuộc thực sự bất cứ khi nào bạn muốn cắm vào các cơ sở đó. Vì vậy, trong mã của bạn, bạn sẽ sử dụng một tiêm phụ thuộc thực sự. Nếu Microsoft không sử dụng DependencyResolver thì có thể bạn đã sử dụng nó (như một mẫu chống dịch vụ định vị) trong mã của bạn để giải quyết các phụ thuộc khi bạn muốn triển khai một số chức năng tùy chỉnh. Điều này có thể là không tốt cho bạn. Bây giờ là không tốt cho Microsoft nhưng bạn không quan tâm đến chúng.

Như vậy tôi là trái tò mò và bối rối vì sao Microsoft sẽ sử dụng định vị dịch vụ trong 2012.

Bởi vì thiết kế một khuôn khổ là không giống như thiết kế một ứng dụng sử dụng một khuôn khổ. Có một số điều khác nhau cần xem xét khi thiết kế một khung công tác tái sử dụng chẳng hạn như ASP.NET MVC thay vì chỉ những gì được viết trong sách. Một số ví dụ là thiết kế khuôn khổ theo cách mà một người sử dụng khung này sẽ có thể tận dụng các phương pháp hay nhất được viết trong các cuốn sách trong mã của mình bằng cách sử dụng khung này.

+9

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ả). –

+23

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. –

+0

@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. –

35

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ó.

+3

Điều đó có vẻ hợp lý, tôi vẫn tự hỏi tại sao tôi nhận được phản hồi này từ Marcin Dobosz (http://blogs.msdn.com/b/marcinon/) trong một email gửi cho tôi anh ta nói về cuốn sách của Mark/và dịch vụ định vị một mô hình chống anh ta nói: "Tôi chưa đọc cuốn sách nên tôi không quen thuộc với lý do vì sao nó là một mẫu chống. Bạn có thể giải thích tại sao bạn nghĩ đó là một thiết kế tồi không?" –

+3

Để làm rõ, tôi gửi email cho Marcin, người mà tôi biết làm việc cho Microsoft, và rất ngạc nhiên khi anh ta không bao giờ nghe nói rằng dịch vụ định vị được gọi là anti-pattern (điều này rất dễ tìm trên internet). xe buýt, nhưng đó là một ví dụ tôi nghĩ về những gì Mark S. đang đề cập đến. –

+0

bạn nói: "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." Bạn có thể cung cấp liên kết đến một số đề xuất không? Tôi có một số tài liệu tham khảo dịch vụ mà nhiều bộ điều khiển của tôi sử dụng. Họ nhận được một đối tượng, được cung cấp cho một đối tượng mô hình (constructor hoặc method) để thực hiện một số công việc để tạo thành một mô hình (viewModel nếu bạn muốn) được cung cấp cho View. lý do chính của tôi để làm IoC là từ dự án thử nghiệm của tôi, tôi muốn có thể cung cấp một cái gì đó khác thực hiện IService từ ServiceReference w/o thực sự gọi Dịch vụ từ dự án thử nghiệm của tôi. – DaveH

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