2011-02-02 10 views
11

Ngắn câu chuyện ngắn, tôi đang cố gắng sử dụng ELMAH với MVC 2 và Ninject, và tôi cần sử dụng các hàm tạo parameterless. Tôi đã tạo một bài đăng ban đầu về nó tại đây: Using a parameterless controller constructor with Ninject?Sử dụng tính năng tiêm thay vì tiêm xây dựng

Tôi được khuyên nên sử dụng tính năng tiêm tài sản thay vì tiêm xây dựng. Vì vậy, tôi chuyển từ này:

public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository departmentsRepository; 

    public DepartmentsController(IDepartmentsRepository departmentsRepository) 
    { 
     this.departmentsRepository = departmentsRepository; 
    } 

    ... 
} 

này:

public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository _departmentsRepository; 

    [Inject] 
    public IDepartmentsRepository DepartmentsRepository 
    { 
     get { return _departmentsRepository; } 
     set { _departmentsRepository = value; } 
    } 

    ... 
} 

Nhưng trong các chức năng điều khiển khác của tôi, cho dù tôi cố gắng truy cập vào DepartmentsRepository hoặc _departmentsRepository, tôi nhận được một tài liệu tham khảo đối tượng không được đặt để một thể hiện của một đối tượng lỗi khi tôi cố truy cập nó.

Có điều gì khác tôi cần làm ở đây không?

+6

Bạn đang sử dụng 'Ninject.Web.Mvc'? –

+2

Đợi cái gì? Điều gì đòi hỏi bạn phải sử dụng các hàm tạo parameterless? – jfar

+0

Tôi gặp vấn đề lạ khi một phụ thuộc cụ thể không được giải quyết khi thuộc tính có tên cụ thể. Nó hoạt động tốt nếu đổi tên, nhưng tất cả các phụ thuộc khác giải quyết như bình thường (và cùng một phụ thuộc giải quyết tốt trong các trường hợp khác cho cùng một tên thuộc tính). Tôi không có một đầu mối tại sao, nhưng nó luôn luôn là một cái gì đó để thử. –

Trả lời

2

Có thể có 2 lý do để tham chiếu đối tượng không được đặt ngoại lệ.

1) Ninject không biết làm thế nào để ràng buộc IDepartmentsRepository đến một thực hiện cụ thể của DepartmentsRepository (tôi nghi ngờ đó là trường hợp mặc dù)

2) Nếu bạn đang cố gắng truy cập vào bất động sản DepartmentsRepository trong constructor của điều khiển của bạn, nó sẽ ném ngoại lệ (vì Ninject chỉ có thể tiêm thuộc tính phụ thuộc sau khi đối tượng được xây dựng).

Hy vọng điều đó sẽ hữu ích.

10

Tôi gặp sự cố tương tự. Hãy xem các câu hỏi của tôi: Using Ninject with Membership.Provider.

Về cơ bản khi bạn khởi DepartmentsController bạn cần phải tiêm this (tức là điều khiển các bộ phận của bạn vào Ninject kernal của bạn Vì vậy một cái gì đó của nó như:..

public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository _departmentsRepository; 

    [Inject] 
    public IDepartmentsRepository DepartmentsRepository 
    { 
    get { return _departmentsRepository; } 
    set { _departmentsRepository = value; } 
    } 

    public DepartmentsController() 
    { 
    NinjectHelper.Kernel.Inject(this); 
    } 
} 

đâu NinjectHelper trong trường hợp này được các hiện Ninject Kernel

+6

điều này sẽ làm việc, nhưng nó là một ý tưởng tốt hơn để sử dụng một ControllerFactory làm tiêm để bộ điều khiển không phải biết về Ninject. –

3

Hãy thử một cái gì đó như thế này:

Global.asax.cs

 protected void Application_Start() 
     { 
      DependencyResolver.SetResolver(
       new MyDependencyResolver(
        new StandardKernel(
         new MyModule()))); 
      //... 
     } 

MyDependencyResolver.cs

public class MyDependencyResolver : IDependencyResolver 
    { 
     private IKernel kernel; 

     public MyDependencyResolver(IKernel kernel) 
     { 
      this.kernel = kernel; 
     } 

     public object GetService(Type serviceType) 
     { 
      return kernel.TryGet(serviceType); 
     } 

     public IEnumerable<object> GetServices(Type serviceType) 
     { 
      return kernel.GetAll(serviceType); 
     } 
    } 

MyModule.cs

public class MyModule : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IDepartmentsRepository>().To<DepartmentsRepository>(); 
     } 
    } 
+0

cách điều này giúp trả lời câu hỏi? –

+1

@dave Điều này có thể giải quyết 'tham chiếu đối tượng của mình không được thiết lập cho một trường hợp của một vấn đề đối tượng ... Đối với Ninject.Web.Mvc, tôi đã không thử nó. – frennky

0

Như Daniel T. trong các bình luận trên được đăng, bạn nên kiểm tra Ninject.Web.Mvc. Nếu bạn sử dụng NinjectHttpApplication trong dự án đó, nó sẽ tự động hoàn thành mọi thứ cho bạn, để khi NinjectControllerFactory xây dựng một bộ điều khiển mới, nó sẽ gọi hàm Inject() để bạn điền vào các thuộc tính injection.