使用Ninject进行自动装配

时间:2012-06-10 06:10:05

标签: c# dependency-injection 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自动挂载依赖关系,但是还没有找到这个特定问题的答案。任何帮助是极大的赞赏。

1 个答案:

答案 0 :(得分: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

而不是像上面那样逐个绑定

你应该用更大的术语思考,并在申请开始时尽可能多地获得。