在哪里以及如何获得Simple Injector容器?

时间:2017-06-10 21:54:59

标签: c# dependency-injection inversion-of-control simple-injector

我的应用程序非常简单,da DAL和BLL只是同一Windows窗体应用程序中的文件夹。

所以我有一个带有Processador方法的Processar()类,这个classe在构造函数中接收它的依赖项(两个存储库),检查出来。

private IFilaRepositorio _repo;
public Processador(IFilaRepositorio filaRepo)
{
    _repo = filaRepo;
}

public void Processar()
{
}

我的类在Program.cs中注册,我创建了新的Form(),将新按钮拖入其中,双击以编写事件,尝试实例化我的Processador类,它要求我提供构造函数参数。如何传递这些论点?我需要从Simple Injector容器中获取它们吗?如果是这样,如何让Simple Injector成为容器?以下是我坚持的观点。

private void button1_Click(object sender, EventArgs e)
{
    Processador proc = new Processador(???); <-- Dont know how to pass the arguments
    proc.Processar();
}

Simple Injector文件说:

  

提示:您通常应该为整个应用程序创建一个Container实例(每个应用程序域一个实例);容器实例是线程安全的。

有人能为我提供一些代码示例和/或有关良好做法的建议吗?

PS:我可以看到,我开始学习DI,IoC,SimpleInjector等等,所以,现在,我不喜欢不太高级的科目:o)

1 个答案:

答案 0 :(得分:3)

IoC的概念是您不需要在整个应用程序中实例化对象。容器为您管理这个。因此,您不再需要使用“new”(对于由容器管理的类)。因为如果你使用'new',我们会添加一个额外的依赖,这正是我们试图用IoC避免的。

在您的情况下:您的Processador只能由容器实例化。所以你不应该在你的buttonhandler中实例化它。为此,您需要确保Processador所需的参数也由容器管理。所以例如如果Processador的签名如下:

Processador(NameFactory nameFactory, FileManager filemanager);

您需要将NameFactory和FileManager添加到容器中。

然后,您可以从容器中检索Processador的实例。例如

container.GetInstance<IProcessador>();

虽然建议通过构造函数注入或属性注入来执行此操作。

如果您希望更好地了解IoC和依赖注入,Miquel Casto可能会对此视频感兴趣:https://www.youtube.com/watch?v=e3gXWh5YBNI

Miquel Castro多年来一直在讨论DI(他也使用代码示例)。

我希望这能回答你问题的一部分。