c# - 使用 Ninject Autowiring

标签 c# dependency-injection ninject

我有一个 WinForms 应用程序,我最近开始使用 Ninject。 Ninject 的大部分教程都像这样显示 Autowiring 的设置:

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 是否可以处理类似于 Spring 中的依赖项 this article .

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 中指定将哪个实例注入(inject) 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,它可以自动创建和注入(inject) IWriter 依赖项,因此您不必担心如何将它应用到应用程序的其余部分。使用当前的 Ninject 教程,我一直无法找到一种方法来执行此操作,并求助于将对象存储到另一个对象中,然后调用它,这不是最好的方法。

我一直在寻找一种使用 Ninject Autowiring 依赖项的方法,但没有找到这个特定问题的答案。任何帮助是极大的赞赏。

最佳答案

首选的方式是构造函数注入(inject)

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>();

您应该使用约定来指定您的绑定(bind),而不是像上面那样一一绑定(bind)https://github.com/ninject/ninject.extensions.conventions/wiki/What-is-configuration-by-convention

而且您应该从更大的角度思考,并在应用程序启动时通过一次获取获得尽可能多的信息。

关于c# - 使用 Ninject Autowiring ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10966716/

相关文章:

dependency-injection - LightSpeed 与 IoC/使用存储库模式的依赖注入(inject)

c# - IsMouseOver WPF 中的不透明度

c# - 如何将 winform 子窗体动态嵌入到主 winform 的选项卡控件中?

c# - MEF——我似乎在这里遗漏了一些东西

php - 如何在不牺牲依赖注入(inject)的情况下简化 API?

dependency-injection - Flutter:(如何)我可以拥有一个每个都依赖 Provider 的小部件的 PageView 吗?

c# - 使用 Ninject 的项目依赖项

c# - 如何使用 Ninject 实例化当前 AppDomain 程序集中某种类型的对象?

c# - 调试拦截器模式

c# - 开发多语言 Windows 应用程序 C#