(这个问题并不依赖于特定的IoC框架,所以我的示例中的接口和类型都是元类型。只需用你喜欢的IoC框架的相应类型替换它们。)
在我的主要方法中,我通常设置我的容器做这样的事情:
static void Main()
{
IInjector in = new Injector();
in.Register<ISomeType>().For<SomeType>();
in.Register<IOtherType().For<OtherType>();
...
// Run actual application
App app = in.Resolve<App>();
app.Run();
}
我的问题是,你是如何得到注射器的?我通常只是自己注册了注射器并注入了自己注射的类型,但我不确定这是否是正确的“模式”。
答案 0 :(得分:14)
你不应该传递容器。
相反,您的入口点/ main方法会向容器询问它需要启动的对象 - 例如您的App对象/ bean。然后容器返回连接到App
的完整对象图,这允许您运行app.Run()
,同时满足所有依赖项。
对于要知道容器的对象,或者每个对象要求容器获取它的依赖性,这是一种反模式 - 如果你这样做,那么你有不倒置控制和你拥有的不是依赖注入 - 你仍然有对象要求他们需要什么,而不是给他们需要的东西。
答案 1 :(得分:2)
最好避免注射注射器。只需创建所需的类型,然后开始执行。我在这个主题上撰写了一篇更长篇文章:Accessing the DI container