dependency injection:如何通过注射容器?

(这个问题不依赖于特定的IoC框架,因此我的示例中的接口和类型是元类型。只需用适合您喜欢的IoC框架的类型替换它们。)

在我的主要方法中,我通常设置我的容器做这样的事情:

static void Main() { IInjector in = new Injector(); in.Register().For(); in.Register<IOtherType().For(); ... // Run actual application App app = in.Resolve(); app.Run(); } 

我的问题是,你是如何得到注射器的? 我通常只是自己注册了注射器,并注入了自己注射的类型,但我不确定这是否是正确的“模式”。

你不应该绕过容器。

相反,您的入口点/ main方法会向容器询问它需要启动的对象 – 例如您的App对象/ bean。 然后容器返回连接到App的完整对象图,这允许您运行app.Run() ,同时满足所有依赖项。

对于要知道容器的对象,或者每个对象要求容器获取它的依赖性,这是一种反模式 – 如果你这样做,那么你没有反转控制,你拥有的不是dependency injection -你仍然有对象要求他们需要什么,而不是给他们需要的东西。

最好避免注射注射器。 只需创建所需的类型,然后开始执行。 我在这个主题上写了一篇稍长的post: 访问DI容器