2012-06-10 93 views
4

我有一個最近開始使用Ninject的WinForms應用程序。大多數教程Ninject的顯示設置爲自動裝配這樣的:自動裝配與Ninject

using (IKernel kernel = new StandardKernel()) 
{ 
    kernel.Bind<ITaxCalculator>() 
     .To<TaxCalculator>() 
     .WithConstructorArgument("rate", .2M); 

    var tc = kernel.Get<ITaxCalculator>(); 
    Assert.Equal(20M, tc.CalculateTax(100M)); 
} 

如果你打算在啓動一個簡短的腳本執行這一類,它是偉大的,但我不知道如何使用這些對象我的其他類和庫在應用程序中。我很好奇Ninject是否可以在this article處理類似於Spring的依賴關係。

package testbean; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 

import writer.IWriter; 

@Service 
public class MySpringBeanWithDependency { 
    private IWriter writer; 

    @Autowired 
    public void setWriter(IWriter writer) { 
     this.writer = writer; 
    } 

    public void run() { 
     String s = "This is my test"; 
     writer.writer(s); 
    } 
} 

然後你就可以在XML中指定哪個實例注入IWriter。然後運行該代碼,這是所有需要:

package main; 

import org.springframework.beans.factory.BeanFactory; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

import testbean.MySpringBeanWithDependency; 

public class Main { 
    public static void main(String[] args) { 
     ApplicationContext context = new ClassPathXmlApplicationContext("META- INF/beans.xml"); 
     BeanFactory factory = context; 
     MySpringBeanWithDependency test = (MySpringBeanWithDependency) factory 
       .getBean("mySpringBeanWithDependency"); 
     test.run(); 
    } 
} 

藉助於Spring,它可以自動創建和注入IWriter依賴性,因此您不必擔心如何得到它的應用程序的其餘部分。使用目前的Ninject教程,我一直無法找到辦法做到這一點,並採取了將對象存儲到另一個對象,然後調用它,這不是最好的方式來做到這一點。

我已經看到了一種自動裝載與Ninject依賴關係的方法,但沒有找到對這個特定問題的答案。任何幫助是極大的讚賞。

回答

4

的首選方法是做構造器注入

public class MySpringBeanWithDependency { 
    private IWriter writer; 

    public MySpringBeanWithDependency(IWriter writer) { 
        this.writer = writer; 
    } 

    public void run() { 
        String s = "This is my test"; 
        writer.writer(s); 
    } 
} 

Kernel.Bind<IWriter>().To<SomeWriter>(); 
Kernel.Get<MySpringBeanWithDependency>(); 

,而不是一個由像你上面應該使用慣例來指定綁定https://github.com/ninject/ninject.extensions.conventions/wiki/What-is-configuration-by-convention

而且你應該考慮在更大的方面,並獲得一個綁定儘可能多的一個人在應用程序啓動。

+0

非常感謝您的幫助!將檢查出擴展DLL。 – Rachael