国际奥委会通常以单身人士的身份实现吗?如何实施IOC



我计划挖掘一个开源的IOC容器之一,以真正弄清楚这100%,但我认为我也会问一般社区(在找不到直接的人之后在任何密切相关的问题中回答)。

据我了解,典型的IOC实现,似乎它是一个全球类,充当具有所有依赖性知识的单身人士。然后,它使用该知识来提供构造函数或属性参数,其中知道如何填充它们?也许我缺少一些问题,因此问题。

有人可以明确地告诉我IOC的工作原理和/或是否是单身人士的根源?

update

我想我的问题是"魔术" ioc事情如何像ninject.mvc一样工作?注射在哪里?

所有主要的DI框架(或至少在Java和.NET中)通常建议在应用程序的寿命中具有单个容器实例。有些容器确实支持"儿童容器"的概念,但是这些子容器是由该单个容器创建的,实际上只是同一实例的一部分。

绝对有可能拥有多个容器,例如每个层或每个会话一个容器,但是当您根据依赖项注入原则设计应用程序时,通常每个应用程序都有一个容器(在.NET的上下文是每个应用程序域,或者通常是在同一Memort空间中运行的所有代码)。在处理由(桌面)客户端和Web服务组成的应用程序时,两者都将拥有自己的容器(因为它们实际上是不同的程序,对其他程序都不了解)。

尽管可以根据(Web用户)会话定义容器实例,请求或类似的内容,但这往往会使事情变得复杂很多,因为很难以比会话更大的寿命注册依赖关系,并且那里在创建一个容器时是很多性能开销。

ioc容器往往不是单例,因为您 May 想要同时运行多个容器(例如,您的系统的每层一层),尽管这不是最常见的做法。

为了访问您的容器,您需要参考实际容器本身。

即使您的容器不是真正的单例,您也可以使用服务定位器这样访问它(另请参见http://msdn.microsoft.com/en-us/library/ff921142(v=pandp.20(v = pandp.20)).aspx)。

没有理由为什么它应该是单身人士。仅仅因为您将实体置于上下文中,您仍然可以运行多个上下文(要使用春季的白话,但不要将论点限制为春季)

请注意,Java之类的平台甚至无法执行单例(由于其多个classloader架构)。

好吧,在在线浏览并与同事交谈之后,我相信没有办法实施IOC(至少在状态程序中。它是一个静态的单身人士。因此,我计划使用组合物根模式,并在服务定位器方式中使用NInignt内核作为静态单例。我仍然会打电话给内核。但是我想我至少会失去对该项目中依赖关系的关注。我只是在圈子里奔跑:)。

类似的东西:

Main
{
  setupkernel();
  Application.Run(kernel.Get<Main>);
}
btn_GetChildForm()
{
    kernel.Get<ChildForm>().Show();
}

如果有人知道更好的方法,请告诉我。否则,这就是我将其拼凑在一起的最佳方法。

服务定位器是一个反pattern

尝试理解"构图根"的性质。

最新更新