2015-09-25 23 views
14

Tôi đã rất hạnh phúc khi sử dụng Ninject trong một thời gian dài bây giờ, và tôi thực sự thích nó, nhưng tôi phải đối mặt với một sự lựa chọn khó khăn kể từ khi phát hành ASP.NET 5MVC 6.Tiếp tục hỗ trợ Ninject trong ASP.NET MVC 6?

Về cơ bản, ngoài cổng, Microsoft đã tiết lộ hệ thống phun phụ thuộc của chính họ; Đó là một trong những kiến ​​thức của tôi đã nhận được rất nhiều lời chỉ trích. Nhưng vấn đề lớn hơn của tôi nằm ở cách nó ảnh hưởng đến các thư viện khác.

Từ another question I askedother resources online, có vẻ như Ninject không hoạt động ngoài hộp với MVC 6. Mặc dù có một "giải pháp" được cung cấp dưới dạng thư viện chi tiết Microsoft.Framework.DependencyInjection.Ninject and Ninject. Điều này thậm chí còn phức tạp hơn vì thư viện đó yêu cầu thêm https://www.myget.org/F/aspnetmaster/ vào danh sách các nguồn cấp dữ liệu NuGet của bạn.

Tôi đã thực hiện một số thao tác tìm và tìm thấy thư viện này được lưu trữ ở đâu; Có vẻ ổn, có vẻ như nó hoạt động tốt từ những gì tôi có thể nói, nhưng có một vài điều khiến tôi gặp rắc rối.

  • Thư viện không thực sự xuất hiện để được lãnh đạo bởi những người sáng tạo Ninject
  • Thư viện này được chôn khá sâu trong một kho lưu trữ tối nghĩa
  • Nguồn Ninject thực tế trực tuyến không bao giờ đề cập đến nó

Vì vậy, về cơ bản, tôi rất lo ngại rằng đây là một số loại phụ tá, và sự hỗ trợ cho Ninject (và thậm chí cả các thư viện container khác) đang chết dần. Có một số thông tin ẩn mà tôi không khám phá ra?

Trả lời

9
  • Thư viện không thực sự xuất hiện để được đứng đầu là Ninject sáng tạo

thư viện đó, và nó sẽ có vẻ these also, nhìn được Microsoft tạo mẫu của các nhà cung cấp dependency injection mà là removed in beta7. Lưu ý rằng liên kết tới số DI in MVC 6 được tham chiếu bởi số original question của bạn cho biết những điều sau;

Các bộ điều hợp vùng chứa DI này tạm thời và có để tham khảo; chúng tôi hy vọng rằng cuối cùng chúng sẽ bị xóa và được thay thế bởi các chủ sở hữu vùng chứa tương ứng .

Như chúng phải vậy. Microsoft không chịu trách nhiệm cho việc duy trì các nhà cung cấp bên thứ 3.

  • Thư viện này được chôn khá sâu trong một kho lưu trữ tối nghĩa

Nếu bạn không biết, ASP.NET 5 vẫn đang được phát triển.Beta 7 có sẵn trên nuget như là một bản phát hành trước, nhưng có những nguồn khác cũng bao gồm;

Những các nguồn được duy trì bởi Microsoft.

  • Nguồn Ninject thực tế trực tuyến không bao giờ đề cập đến nó

Như với bất kỳ phát triển mới, 3 nhà cung cấp thư viện của bên mình phải xác định khi nào (nếu có) họ sẽ cung cấp triển khai các sản phẩm của họ hỗ trợ codebase mới. Đối với một số người, nó sẽ được xem là hiệu quả nhất để chờ cho đến khi khuôn khổ mới được chính thức phát hành, vì các thay đổi phá vỡ API vẫn còn rất có khả năng xảy ra cho đến thời điểm đó. Cho dù hỗ trợ sẽ được thực hiện ở tất cả là tất nhiên lên đến các nguồn lực của nhà cung cấp, và/hoặc trong trường hợp của nguồn mở cộng đồng.

38

Có một cuộc thảo luận diễn ra giữa các nhà bảo trì của các thư viện DI hiện có, có hay không xây dựng, duy trì và hỗ trợ bộ điều hợp cho hệ thống DI tích hợp sẵn mới của ASP.NET. Các nhà bảo trì Autofac có confirmed rằng họ sẽ tạo và hỗ trợ bộ điều hợp, trong khi nhóm Ninject là silent và các nhóm khác như nhóm Injector đơn giản (bao gồm tôi) have explained rằng họ sẽ không hỗ trợ bộ điều hợp.

Cá nhân, tôi nghĩ thư viện DI tích hợp sẵn trong ASP.NET Core là thư viện DI đẹp và sạch, nhưng nó chỉ giới hạn ở các ứng dụng đơn giản. Như tôi đã giải thích here, nhiều tính năng được yêu cầu để phát triển các ứng dụng bảo trì được xây dựng xung quanh các nguyên tắc SOLID không được hỗ trợ. Tuy nhiên, giống như thư viện Unity DI đã làm một vài năm trước đây, tôi nghĩ rằng container tích hợp này có thể thực sự kích hoạt các nhà phát triển bắt đầu sử dụng tiêm phụ thuộc, đó là một chiến thắng cho ngành công nghiệp của chúng tôi.

Những giới hạn này làm cho vùng chứa được tích hợp sẵn đặc biệt phù hợp với cấu hình và mở rộng hệ thống ASP.NET. Để xây dựng các ứng dụng có thể bảo trì lớn, bạn sẽ cần phải sử dụng một thư viện DI khác. Điều này tất nhiên là tốt; bạn sẽ phải chọn đúng công cụ cho công việc.

Thật không may, cho đến bây giờ, nhóm ASP.NET đã liên lạc publicly sử dụng thư viện DI khác, có nghĩa là bạn sẽ phải viết/sử dụng bộ điều hợp. Thật không may là IMO tin nhắn sai, vì hầu hết các thư viện DI không tương thích với API được trình bày bởi vùng chứa được tích hợp sẵn (như tôi đã giải thích chi tiết herehere chi tiết). Chỉ Autofac có vẻ hợp lý đồng bộ, điều này giải thích tại sao nhóm Autofac chọn duy trì bộ điều hợp. Nhưng lưu ý rằng ngay cả Autofac đã được chứng minh là không tương thích với trừu tượng mà Microsoft xác định, và họ (giống như StructureMap) đã phải làm cho big changes cho sản phẩm của họ thậm chí có thể tuân thủ với sự trừu tượng hóa. Và những người bảo trì Autofac là severely frustrated về toàn bộ quá trình và sự trừu tượng nói chung. Và như tôi đã giải thích here, ngay cả việc cung cấp bộ điều hợp ASP.NET được cung cấp của Ninject bị hỏng.

Thông báo này do nhóm ASP.NET sử dụng bộ điều hợp IMO là lỗi lớn, vì điều này ngăn cản sự đổi mới (trong khi thư viện DI không có; nó chỉ là thư viện DI khác). ASP.Đội ngũ NET đang quảng bá một mô hình nơi cả các thành phần ứng dụng của bạn và hệ thống ASP.NET (và tất cả các hệ thống phụ khác sẽ bổ sung trong tương lai) sẽ được đăng ký trong vùng chứa tùy chỉnh của bạn. Nó là hợp lý hơn và thiết thực để giữ cho cấu hình ứng dụng của bạn tách biệt với cấu hình của hệ thống ASP.NET (như được giải thích here).

Vì lý do này, tôi thấy việc sử dụng bộ điều hợp cho bất kỳ vật chứa nào thay vì vô ích. Như tôi đã chỉ ra here nó thực sự dễ dàng để cắm container DI của riêng bạn, trong khi vẫn giữ nó hoàn toàn tách biệt với đăng ký của ASP.NET. Điều này có nghĩa là bạn không cần hỗ trợ cho Ninject để có thể sử dụng Ninject hiệu quả trên một dự án ASP.NET Core. Điều duy nhất Ninject cần làm là tạo một phiên bản tương thích với .NET Core (trong trường hợp sản phẩm của bạn cần chạy trên nền tảng mới đó). Tóm lại, tôi không chắc chắn rằng hỗ trợ 'đang chết dần', mặc dù một số người bảo trì DI (như đội Injector đơn giản, và có thể cả Castle Windsor và Ninject) đã chọn không xây dựng, duy trì và hỗ trợ việc triển khai bộ điều hợp cho ASP.NET Core, bởi vì nó không cần thiết và chỉ có trong quá trình thực hiện.

CẬP NHẬT tháng 11 năm 2016

Tôi đã discussing some improvements để ASP.NET Core với Microsoft để làm cho nó dễ dàng hơn để cắm một bình chứa mà không có một bộ chuyển đổi (hãy nhìn vào example repository của tôi và đặc biệt là các Startup.cs of the Ninject sample project), nhưng cho đến bây giờ, Microsoft dường như không thể tiến triển được vì (như Fowler tự khẳng định) "bias towards conforming containers [là] tách rời tầm nhìn của họ".

+0

Cảm ơn bài đăng sâu sắc, điều quan trọng bị thiếu trong vùng chứa DI được xây dựng là không có ánh xạ dựa trên quy ước. Tôi phải bao gồm mọi dự án duy nhất theo dự án khởi động của tôi và lập bản đồ các phụ thuộc. Điều này có vẻ như một sai lầm rất lớn, trừ khi tôi đang thiếu một cái gì đó. – Spets

+3

@Spets Vùng chứa được xây dựng sẵn đặc biệt có nghĩa là một hệ thống cấu hình cho chính ASP.NET. Vì vậy, điều này có nghĩa rằng bạn có thể dễ dàng trao đổi các phần của ASP.NET và các thành phần bên thứ 3 có thể sử dụng cùng một mô hình cấu hình. Thùng chứa được tích hợp sẵn được xây dựng xung quanh mô hình đó và điều đó giải thích tại sao một số tính năng không được thực hiện. Lưu ý rằng đăng ký theo lô thực sự dễ dàng để tự viết lên trên cùng của vùng chứa và để trở thành thư viện DI hấp dẫn, các tính năng quan trọng khác cần được triển khai trước tiên. Nhưng một lần nữa, đừng lạm dụng hệ thống DI để đăng ký các loại của riêng bạn. – Steven

+0

Gotcha có ý nghĩa. – Spets

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