IoC容器,流畅的接口循环引用

时间:2011-04-13 15:04:17

标签: dependency-injection inversion-of-control castle-windsor

我有一个应用程序,其中包含从IView(项目A)继承的视图

我在另一个项目(项目B)中将Windsor IoC Container作为Singleton

项目A具有对项目B的引用,并对容器进行静态调用以解析特定视图的具体类型

如果我使用XML配置来配置我的容器,那么一切都很好。

如果我尝试使用流畅的界面来配置我的对手,我会得到一个循环引用,因为我现在需要项目B来引用项目A以指定接口和具体类型

那么使用流畅的界面进行此操作的最佳方法是什么?

编辑:

项目A在应用启动时有这个:

IoC.Instance.Start(); // this configures the container from config
IoC.Instance.Container.Resolve<IBootStrapper>().Start();

其中IoC是项目B中定义的静态类

1 个答案:

答案 0 :(得分:3)

最好是围绕依赖注入(构造函数注入)设计应用程序,并在应用程序的启动路径(组合根)上配置容器。理想情况下,您的项目B不应该依赖于DI容器本身,或者最多在项目中有一些允许为该项目创建配置的引导代码。

当您在启动项目中注册容器时(可能是您的案例中的项目A),您将没有循环引用。

<强>更新

在评论中,您解释说您的Project B项目仅用于IOC引导。使用bootstrapper项目没有任何问题,因为这将允许所有其他项目完全清除使用任何IOC容器。如果您有多个库被多个应用程序重用(例如,Web应用程序,Web服务和Windows服务使用的业务层),您通常会使用引导程序项目。

然而,引导程序项目应该只引导可重用项目的“静态”依赖项。配置每个应用程序项目更改的内容是没有意义的。接下来,由于引导程序本身就是一个可重用的项目,因此您不希望它依赖于您的某个应用程序项目,因为这将是您要交换的部分。在运行Windows服务时引用ASP.NET Web应用程序有什么用?那太棒了。

启动程序项目在具有多个应用程序项目时特别有用,但这并不意味着您无法在单个应用程序解决方案中使用它。这里仍然适用相同的规则,因为你最终会得到循环引用,正如你已经注意到的那样。

换句话说,解决方案很简单:让bootstrapper只为下面的项目引导依赖项,而不是应用程序项目。但是,如果应用程序项目是您拥有的唯一项目,则不需要引导程序项目;它不会起作用。