IOC thời gian biên dịch


11

Có ai đã bắt đầu một dự án để làm IOC vào thời gian biên dịch (có thể sử dụng Roslyn hoặc Linq MethodInfo phát ra) chưa?

Trải nghiệm của tôi với các container IOC cho đến nay vẫn rất tuyệt vời, giải quyết một vài vấn đề nhỏ

  1. Nhiều container IOC khởi động chậm, vì phần lớn logic phân giải xảy ra ở đây
  2. Thường rất khó để đảm bảo rằng độ phân giải là có thể, vì quá trình biên dịch không còn đảm bảo rằng hàm tạo có thể được gọi
  3. Thông thường các thùng chứa IOC thêm một chi phí nhỏ vào thời gian chạy (một số thậm chí không nhỏ, thường là các thùng chứa khởi động nhanh chóng chạy chậm)

Dường như với tôi rằng giải pháp lý tưởng sẽ là thêm một bước biên dịch vào chuỗi xây dựng có thêm lớp Factory thay vì IOC.

Có ai làm điều này trước khi? Nếu không, tai sao không?

Câu trả lời:


4

Làm điều này không nên là một vấn đề như vậy. Chỉ cần chạy logic IoC tương tự và thay vì khởi tạo các lớp, bạn phát ra mã thực hiện việc khởi tạo.

Nhưng bằng cách này, bạn sẽ loại bỏ một lợi thế rất lớn của IoC: Khả năng thay đổi cách các phần tử được tạo ra mà không phải biên dịch lại toàn bộ ứng dụng. Chỉ cần thay thế cấu hình, bạn có thể có ứng dụng sử dụng các dịch vụ hoặc nguồn dữ liệu khác nhau. Và mặc dù tôi chưa thấy ứng dụng nào tận dụng hết khả năng này, nó vẫn là một phần chính trong thành công của IoC.


Vâng tôi biết điều đó là có thể. Nhưng tôi vẫn chưa thấy một container IoC làm điều đó. Ngoài ra tôi đã lưu ý rằng xu hướng hiện tại dường như là hướng tới đăng ký bằng mã (API thông thạo). Cho rằng, tôi đang xem xét việc viết IoC container.
ArTs

Tôi dường như nhớ Hiro ( github.com/philiplaureano/Hiro ) có thể làm công cụ của nó tại thời gian biên dịch.
lzcd

2
"Nhưng bằng cách này, bạn đang loại bỏ một lợi thế rất lớn của IoC: Khả năng thay đổi cách các phần tử được tạo ra mà không phải biên dịch lại toàn bộ ứng dụng." Dường như với tôi rằng việc áp dụng điều này cho toàn bộ ứng dụng là quá mức cần thiết; bạn đang biến mọi phần của ứng dụng thành một trình cắm thêm. Ngoài ra, cả hai kỹ thuật sẽ có thể cùng tồn tại - không có lý do gì bạn không thể kết nối một số thành phần trong thời gian biên dịch và một số khi chạy.
Doval

Tôi không thấy đó là một lợi thế lớn như thế nào. Trong bối cảnh nào bạn hoàn toàn thay thế các thành phần trong thời gian chạy? Một vài trường hợp sử dụng cấu hình có thể?
andyczerwonka

4

Dagger cho Java / Android thực hiện điều đó. Nó hy sinh một số phép thuật thời gian chạy (như của Guice) để cung cấp trải nghiệm mã hóa thời gian gần như hoàn toàn biên dịch, bao gồm chuyển đổi hầu hết các lỗi thời gian chạy sang lỗi biên dịch.

Sẽ rất tuyệt trong .NET.

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.