2009-07-09 26 views
9

Tôi biết một số khung công tác DI hỗ trợ điều này (ví dụ: Ninject), nhưng tôi đặc biệt muốn biết liệu điều đó có thể thực hiện được với Autofac hay không.Autofac có thể tự động ràng buộc không?

Tôi muốn có thể yêu cầu một thùng chứa Autofac cho một lớp bê tông và lấy lại một cá thể với tất cả các phụ thuộc hàm dựng thích hợp được tiêm, mà không bao giờ đăng ký lớp bê tông đó. Tức là, nếu tôi không bao giờ ràng buộc nó một cách rõ ràng, sau đó tự động ràng buộc lớp bê tông cho chính nó, như thể tôi đã gọi builder.Register<MyClass>();

Một ví dụ tốt về khi điều này sẽ có ích được ViewModels. Trong MVVM, phân lớp là như vậy mà chỉ View phụ thuộc vào ViewModel, và rằng thông qua gõ lỏng lẻo, và bạn không đơn vị kiểm tra xem anyway. Vì vậy, không cần phải giả lập ViewModel để kiểm tra - và do đó không có lý do gì để có một giao diện cho mỗi ViewModel. Vì vậy, trong trường hợp này, mẫu DI thông thường của "đăng ký giao diện này để giải quyết cho lớp này" là sự phức tạp không cần thiết. Rõ ràng tự ràng buộc, như builder.Register<MyClass>();, cũng cảm thấy giống như một bước không cần thiết khi đối phó với một cái gì đó đơn giản như một lớp cụ thể.

Tôi biết về số reflection-based registration example trong tài liệu Autofac, nhưng đó cũng không phải là sở thích của tôi. Tôi không muốn sự phức tạp (và chậm chạp) của việc đăng ký mọi lớp học có thể trước thời hạn; Tôi muốn khung làm việc cho tôi những gì tôi cần khi tôi cần. Công ước về cấu hình, và tất cả điều đó.

Có cách nào để định cấu hình Autofac để có thể nói "Ồ, đây là loại cụ thể và chưa đăng ký, vì vậy tôi sẽ chỉ hoạt động như đã được đăng ký với cài đặt mặc định"?

Trả lời

12
builder.RegisterTypesMatching(type => type.IsClass) 

Nếu bạn look at the source bạn sẽ thấy rằng RegisterTypesMatching (và RegisterTypesFromAssembly) KHÔNG LÀM BẤT CỨ REFLECTION. Tất cả các Autofac đang làm trong trường hợp này là đăng ký một quy tắc chấp nhận một loại hay không. Trong ví dụ trên tôi chấp nhận bất kỳ loại nào là một lớp.

Trong trường hợp RegisterTypesFromAssembly, Autofac đăng ký quy tắc cho biết "nếu loại bạn đang cố gắng giải quyết có Assembly == assembly được chỉ định, thì tôi sẽ cung cấp cho bạn một ví dụ".

Vì vậy:

  1. không có loại phản ánh được thực hiện vào thời điểm đăng ký
  2. bất kỳ loại phù hợp với tiêu chí sẽ được giải quyết

So với đăng ký các loại bê tông trực tiếp, điều này sẽ có một hit hoàn hảo tại thời điểm giải quyết kể từ khi Autofac sẽ phải tìm ra ví dụ yêu cầu của hàm tạo. Điều đó nói rằng, nếu bạn đi với phạm vi cá thể mặc định, đó là singleton, bạn chỉ cần nhấn lần đầu tiên bạn giải quyết loại đó. Lần sau nó sẽ sử dụng cá thể singleton đã được tạo ra.

Cập nhật: trong Autofac 2 có cách tốt hơn để làm cho vùng chứa có thể giải quyết mọi thứ. Điều này liên quan đến the AnyConcreteTypeNotAlreadyRegistered registration source.

+0

Ngọt ngào - Nghe có vẻ giống như những gì tôi đang tìm kiếm. Cảm ơn! –

2

gì về:

builder.RegisterTypesFromAssembly(Assembly.GetExecutingAssembly()); 

không phản ánh được thực hiện, như Peter Lillevold points out.

+1

Đã xóa các nhận xét trước đó của tôi vì bạn đã đúng (như bạn đã làm rõ trong bản chỉnh sửa của mình): RegisterTypesFromAssembly không phản ánh khối lượng như tên gọi của nó. Nó chỉ là một trong số các chức năng viết tắt của RegisterTypesMatching, và thực hiện chính xác những gì tôi đang tìm kiếm, nhưng với nhiều điều khiển tốt hơn, điều này khá ngọt ngào. Lời xin lỗi của tôi cho sự hiểu lầm câu trả lời của bạn lần đầu tiên xung quanh. –

+0

Liên kết bạn đã cung cấp bị hỏng ... – Guillaume

+1

hãy tha thứ cho tôi nhưng câu trả lời này là 3 tuổi: P bên cạnh đó, rất nhiều điều đã xảy ra với autofac kể từ đó, tôi không nghĩ rằng bất kỳ điều này có liên quan nữa .. –

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