2009-07-21 25 views
11

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?

Trả lời

6

Đã tìm ra - nó khá dễ thực hiện bằng cách ràng buộc với một nhà cung cấp;

Kernel.Bind<MyDataContext>().ToProvider<ContextProvider>().InRequestScope(); 

Ninject bây giờ sẽ gọi ContextProvider của tôi bất cứ khi nào cần xây dựng một trong những đối tượng DataContext pesky này. Đây là lớp nhà cung cấp của tôi trông như thế nào:

public class ContextProvider : IProvider 
{ 
    #region IProvider Members 

    public object Create(IContext context) 
    { 
     return new MyDataContext(); 
    } 

    public Type Type 
    { 
     get { throw new NotImplementedException(); } 
    } 

    #endregion 
} 

Dường như tôi đã bỏ đi - nó hoạt động tốt. :)

7

Tôi đoán bạn cũng có thể sử dụng 'ToMethod' ràng buộc để tránh việc thực hiện cung cấp dịch vụ tùy chỉnh, đó là cách tôi sử dụng:

Kernel.Bind<MyDataConext>().ToMethod(c => new MyDataContext()) 
+2

Để đượ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. –

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