Tôi đã bắt đầu sử dụng Ninject 2 (tải về từ Github ngày hôm qua bao gồm các dự án mở rộng MVC) với một dự án dựa trên các công nghệ sau:Làm thế nào tôi có thể nhận được Ninject 2 để sử dụng constructor parameterless cho LINQ to SQL DataContext?
- Net 3.5 Sp1
- ASP.NET MVC 1.0
- LINQ to SQL
Không có gì huyền diệu ở đây - tôi có một vài giao diện kho (tên như IEntityRepository) được triển khai bằng LINQ to SQL trong mã runtime (và sử dụng một Hashtable trong mã kiểm tra đơn vị). Mỗi kho lưu trữ này cần một cá thể của DataContext từ LINQ to SQL để nói chuyện với cơ sở dữ liệu, vì vậy đó là một tham số hàm dựng trên các lớp kho lưu trữ cụ thể. Các ràng buộc được thiết lập như thế này:
Kernel.Bind<MyDataContext>().ToSelf().InRequestScope();
Lý do cho điều này là tôi muốn để có thể chia sẻ các đơn vị giữa các kho khác nhau nếu tôi nên xảy ra cần nhiều trong số họ, và với LINQ to SQL DataContext đơn vị của triết lý công việc, có vẻ như có ý nghĩa với tôi để tạo ra một cho mỗi HttpRequest.
Tôi thường sử dụng hàm tạo parameterless cho MyDataContext - Tôi không thấy đó là rủi ro vì nó được sử dụng cho dự án nội bộ trên hệ thống thử nghiệm, vì vậy chuỗi kết nối "tích hợp" trong datacontext là vô hại. Tuy nhiên, vì Ninject 2 là "tham lam" và muốn hàm tạo với các tham số MOST, và tôi không thể thực sự gắn tham số [Inject]
vào mã được tạo theo bất kỳ cách nào có ý nghĩa, tôi gặp lỗi bất cứ khi nào Ninject cố tạo một bộ điều khiển của tôi (cần một kho lưu trữ, cần có datacontext).
Tôi đã thấy đề cập đến IConstructorScorer
và khả năng tạo một "đảo ngược" luôn sử dụng hàm tạo với thông số LEAST, nhưng sau đó lại thay đổi cách thức hoạt động của công cụ này. những gì tôi muốn cho tất cả mọi thứ nhưng datacontext.
Vậy - có cách nào tốt đẹp, rõ ràng để xác định rằng ràng buộc này (và chỉ ràng buộc này) nên sử dụng một hàm tạo cụ thể không? Chúng ta có thể làm điều tương tự với các nhà cung cấp như trong Ninject 1, và có lẽ cung cấp "nhà máy" của chúng ta? Hay tôi nên cho vào và cố gắng đưa các tham số vào trong datacontext có ý nghĩa?
Để được hoàn tất, tôi sẽ thêm 'InRequestScope() 'để đảm bảo tuổi thọ của DataContext được sắp xếp đúng. –